码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2020-01-12 09:43:33      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:表示   iss   size   arguments   ada   oid   pre   inf   ==   

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

 

创建 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 类型也是有的。

 

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

标签:表示   iss   size   arguments   ada   oid   pre   inf   ==   

原文地址:https://www.cnblogs.com/keatkeat/p/12181646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!