c# 常用反射和表达式树整理

很久没有写反射了,来整理一下呗.

创建 Type 

public class Abc {}
var type = typeof(Abc); // class to type
var type2 = new Abc().GetType(); // instance to type

有泛型的

public class Abc<T, U> {}

var type = typeof(Abc<,>).MakeGenericType(new[] { typeof(string), typeof(string) });

创建实例

public class Abc{
    public string name { get; set; }
}
var abc = Activator.CreateInstance(typeof(Abc)) as Abc;

有参数的

public class Abc
{
    public Abc(string name) { }
}
var abc = Activator.CreateInstance(typeof(Abc), new object[] { "name" }) as Abc;

有可选参数的

public class Abc
{
    public Abc(string name = "dada") { }
}
var abc = Activator.CreateInstance(typeof(Abc), BindingFlags.OptionalParamBinding, null, new object[] { Type.Missing }, CultureInfo.CurrentCulture) as Abc;

几个点留意一下

一定要有 BindingFlags.OptionalParamBinding, 也有人放完. BindingFlags.CreateInstance BindingFlags.Public BindingFlags.Instance

Type.Missing 表示没有传 value

CultureInfo.CurrentCulture 不清楚用来干嘛.

获取方法

public class Abc
{
    public void method1<T>(string name) where T : class {  }
    public void method1() { }
}

var methods = typeof(Abc).GetMethods().Single(m => m.Name == nameof(Abc.method1) && m.GetParameters().Count() == 1 && m.GetGenericArguments().Count() == 1);

遇到有同名方法,一般上是通过过滤来找到的, 比如看 parameters 类型, 名字,数量, 或者是 generic 的名字,类型,数量

甚至看返回值也是可以的. sometime 我们需要先 makeGenegic 然后才查看 parameters 类型也是有的。

猜你喜欢

转载自www.cnblogs.com/keatkeat/p/12181646.html
今日推荐