[C#]Type型について(typeof/ GetTypeなど)

C# C#

C#のTypeを使ったので、ついでにまとめてみました。

C#のTypeとは

型情報を扱うためのクラスのようです🤔
型を判定したり、クラスのプロパティ情報を取ったりなどができるようです。

Typeを使う:基礎編

今回使ったものや、使いそうなやつを書いておきます。

クラスからTypeを取得したいとき

typeofにクラスを渡して使うと取得できます。

 Type type = typeof (string);

インスタンスからTypeを取得したいとき

GetTypeメソッドを呼び出すと取得できます。

var type = object.GetType();

文字列からTypeを取得したいとき

TypeのGetTypeメソッドにクラス名を渡すと取得できます。
(渡すクラス名はobject.GetType().FullNameで取れるやつ。)

Console.WriteLine(Type.GetType("System.Object").FullName);
[結果]
System.Object

Typeからクラス名を取得する

Nameメソッドでクラス名、FullNameメソッドでnamespaceからの名前を取得できます。

var person = new Person();
Console.WriteLine(person.GetType().Name);
[結果]
Person
var person = new Person();
Console.WriteLine(person.GetType().FullName);
[結果]
TestCSharp.TypeTest+Person

Typeを使う:実践編

型が同じか判定する

インスタンスから取得したTypeと、
typeofで取得したTypeが同じだったら、typeofで指定したクラスと同じインスタンスだと判別できます。

public class Person
{
    public string Name { set; get; }
    public int Age { set; get; }
    public DateTime Birthday { set; get; }
}

public static void Test()
{
    var person = new Person();
    Console.WriteLine(person.GetType() == typeof(Person));
}
[結果]
True

Type.IsAssignableFromを使って、Listか判定する

 if (typeof(IEnumerable).IsAssignableFrom(obj.GetType())) {

}

Typeを使って、クラスのインスタンス作成

GetTypeで取得したTypeをActivator.CreateInstanceに渡すとインスタンスが作れます。
文字列からインスタンスを作成したりできますねー

namespace TestCSharp
{
    public class Person
    {
        public string Name { set; get; }
        public int Age { set; get; }
        public DateTime Birthday { set; get; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var test = (Person)Activator.CreateInstance(Type.GetType("TestCSharp.Person"));
            Console.WriteLine(test.GetType() == typeof(Person));
        }
    }
}
[結果]
True

クラスのプロパティ情報を取得する

TypeのGetPropertiesメソッドで取得できます。
Publicのプロパティしか取れないので注意。

System.Reflection.PropertyInfoの配列が返ってきます。
クラスのプロパティに、この型のオブジェクトがあったらみたいなことができますね。

public class Person
{
    public string Name { set; get; }
    public int Age { set; get; }
    public DateTime Birthday { set; get; }
}

public static void Test()
{
    var person = new Person();
    var properties = person.GetType().GetProperties();
    foreach (var property in properties)
    {
        Console.WriteLine(property);
    }
}
[結果]
System.String Name
Int32 Age
System.DateTime Birthday

コメント

タイトルとURLをコピーしました