Подтвердить что ты не робот

Существует ли эквивалент С# для typeof для свойств/методов/членов?

Метаданные классов Type могут быть получены несколькими способами. Два из них:

var typeInfo = Type.GetType("MyClass")

и

var typeInfo = typeof(MyClass)

Преимущество второго способа заключается в том, что опечатки будут пойманы компилятором, а среда IDE может понять, о чем я говорю (позволяя функциям, таким как рефакторинг, работать без бесшумного нарушения кода)

Существует ли эквивалентный способ сильного ссылки на элементы/свойства/методы для метаданных и отражения? Могу ли я заменить:

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

с чем-то вроде:

var propertyInfo = property(MyClass.MyProperty)

4b9b3361

Ответ 1

Нет, к сожалению нет. Он обсуждался и даже назывался: infoof (произносится как "in-foof" для комедии), но он еще не реализован... пока. Эрик Липперт имеет сообщение в блоге об этом.

Ближе всего вы можете зайти на С# 3, чтобы заставить компилятор сгенерировать дерево выражений, а затем вытащить его из этого, но это вряд ли приятно.

Ответ 2

Я только что реализовал эквивалент свойств конструкции '' метода '' 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
}

как я понимаю, мы не могли использовать тот же 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

Ответ 3

В С# 6 все еще нет infoof, но есть nameof:

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

Это, конечно, не более краткое, но, по крайней мере, это рефакторинг.

Ответ 4

Нет, такого синтаксиса в С# нет.