2010-03-19 59 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)) 

這當然不是更簡潔,但至少它是重構友好的。

相關問題