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
コメント