Dav*_*vid 18 .net c# reflection
Type可以通过多种方式获得类元数据.其中两个是:
var typeInfo = Type.GetType("MyClass")
和
var typeInfo = typeof(MyClass)
第二种方式的优点是编译器会捕获拼写错误,并且IDE可以理解我正在谈论的内容(允许重构等功能而不会默默地破坏代码)
是否存在强烈引用元数据和反射的成员/属性/方法的等效方法?我可以更换:
var propertyInfo = typeof(MyClass).GetProperty("MyProperty")
有类似的东西:
var propertyInfo = property(MyClass.MyProperty)
小智 10
我刚刚使用Syste.Linq.Expressions实现了'fieldof''fieldof'方法的构造'propertyof'
所以不要写作
var mi = typeof (string).GetMethod("Concat", new[] {typeof (object), typeof (object)});
Run Code Online (Sandbox Code Playgroud)
您可以使用:
var mi = ReflectionHelper.MethodOf(() => string.Concat(new object(), new object()));
Run Code Online (Sandbox Code Playgroud)
我们为什么需要这个?因为现在我们可以安全地重构方法,我们使用via反射
帮助程序类的列表(您可能需要在方法中添加一些信息性异常):
/// <summary>
/// Represents a set of helpers for .net reflection
/// </summary>
public static class ReflectionHelper
{
#region Public methods
/// <summary>
/// Gets a MethodInfo object from specified expression
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="methodExpression"></param>
/// <returns></returns>
public static MethodInfo MethodOf<TResult>(Expression<Func<TResult>> methodExpression)
{
return ((MethodCallExpression)methodExpression.Body).Method;
}
/// <summary>
/// Gets a MethodInfo object from specified expression
/// </summary>
/// <param name="methodExpression"></param>
/// <returns></returns>
public static MethodInfo MethodOf(Expression<Action> methodExpression)
{
return ((MethodCallExpression)methodExpression.Body).Method;
}
/// <summary>
/// Gets a MethodInfo object from specified expression
/// </summary>
/// <param name="methodExpression"></param>
/// <returns></returns>
public static MethodInfo MethodOf<TInstance, TResult>(Expression<Func<TInstance, TResult>> methodExpression)
{
return ((MethodCallExpression)methodExpression.Body).Method;
}
/// <summary>
/// Gets a MethodInfo object from specified expression
/// </summary>
/// <param name="methodExpression"></param>
/// <returns></returns>
public static MethodInfo MethodOf<TInstance>(Expression<Action<TInstance>> methodExpression)
{
return ((MethodCallExpression)methodExpression.Body).Method;
}
/// <summary>
/// Gets a PropertyInfo object from specified expression
/// </summary>
/// <param name="propertyGetExpression"></param>
/// <returns></returns>
public static PropertyInfo PropertyOf<TProperty>(Expression<Func<TProperty>> propertyGetExpression)
{
return ((MemberExpression)propertyGetExpression.Body).Member as PropertyInfo;
}
/// <summary>
/// Gets a PropertyInfo object from specified expression
/// </summary>
/// <param name="propertyGetExpression"></param>
/// <returns></returns>
public static PropertyInfo PropertyOf<TInstance, TProperty>(Expression<Func<TInstance, TProperty>> propertyGetExpression)
{
return ((MemberExpression)propertyGetExpression.Body).Member as PropertyInfo;
}
/// <summary>
/// Gets a FieldInfo object from specified expression
/// </summary>
/// <param name="fieldAccessExpression"></param>
/// <returns></returns>
public static FieldInfo FieldsOf<TProperty>(Expression<Func<TProperty>> fieldAccessExpression)
{
return ((MemberExpression)fieldAccessExpression.Body).Member as FieldInfo;
}
//TODO: ConstructorOf(...)
#endregion //Public methods
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我们无法使用相同的aproach来获取getParameterInfo或EventInfo
另一种方法,由Jb Evain描述,请参阅:http://evain.net/blog/articles/2010/05/05/parameterof-propertyof-methodof?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+jbevain+%28Jb 在+ + A +简而言之%29
在 c# 6 中仍然没有,infoof但有nameof:
var propertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty))
Run Code Online (Sandbox Code Playgroud)
它当然不是更简洁,但至少它是重构友好的。