2010-03-19 99 views
16

可以通过几种方式获得元数据Type。其中两个是:是否有C#等同于属性/方法/成员的typeof?

var typeInfo = Type.GetType("MyClass")

var typeInfo = typeof(MyClass)

的第二种方式的优点是错别字会被编译器捕获,并且IDE能够理解我在说什么about(允许重构等功能在没有静默地破坏代码的情况下工作)

是否存在强制引用元数据和reflecti的成员/属性/方法的等效方式上?我能代替:

var propertyInfo = typeof(MyClass).GetProperty("MyProperty")

的东西,如:

var propertyInfo = property(MyClass.MyProperty)

回答

16

不,可惜没有。它已被讨论,甚至被命名为:infoof(为喜剧价值发音为“in-foof”),但尚未实施......。 Eric Lippert拥有blog post about it

最接近C#3的是让编译器生成一个表达式树,然后把它拉出来 - 但这并不令人愉快。

0

不,在c#中没有这样的语法。

10

我刚刚实施的 'fieldof' 使用Syste.Linq.Expressions

的建设“性能中 '推法' 等同所以不是写

var mi = typeof (string).GetMethod("Concat", new[] {typeof (object), typeof (object)}); 

你可以使用:

var mi = ReflectionHelper.MethodOf(() => string.Concat(new object(), new object())); 

为什么我们需要这个?因为现在我们安全的重构方法,我们通过反射使用

辅助类(您可能需要的方法添加一些信息例外)上市:

/// <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 
} 

按照我的理解,我们不能使用相同的形式给出了对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+in+a+nutshell%29

+0

+1 @Marvinsky这是非常酷的想法,如果你使用默认(类型)而不是新的类型()参数,所以你不必能够实例化任何东西吗? – jbtule 2011-11-11 14:48:34

+0

是的,即使你写'new Something()',它也会工作,但它不会被实例化,因为它只是一个表达式,强制使得我们的表达式尽可能短,所以默认(Something) - 更好 – 2011-11-12 05:46:57

+0

不错的解决方案。但是,它非常缓慢。 – user626528 2016-07-18 05:56:34

1

在C#6还是有没有infoofnameof

var propertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty)) 

这当然不是更简洁,但至少它是重构友好的。

相关问题