对于属性/方法/成员,是否存在类型的C#?

时间:2010-03-19 15:58:10

标签: c# .net reflection

可以通过多种方式获取类Type元数据。其中两个是:

var typeInfo = Type.GetType("MyClass")

var typeInfo = typeof(MyClass)

第二种方式的优点是编译器会捕获拼写错误,并且IDE可以理解我正在谈论的内容(允许重构等功能而不会默默地破坏代码)

是否存在强烈引用元数据和反射的成员/属性/方法的等效方法?我可以替换:

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

有类似的东西:

var propertyInfo = property(MyClass.MyProperty)

5 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

我刚刚使用Syste.Linq.Expressions实现了''fieldof''fieldof'的构造属性的等价物

所以不要写

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

你可以使用:

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

为什么我们需要这个?因为现在我们可以安全地重构方法,我们使用via reflection

帮助程序类的列表(您可能需要在方法中添加一些信息性异常):

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

据我所知,我们无法使用相同的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+in+a+nutshell%29

答案 2 :(得分:4)

在c#6中,仍然没有infoof,但有nameof

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

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

答案 3 :(得分:2)

现在在 c# 中,我们有 nameof()

参考 link

答案 4 :(得分:0)

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