Вопрос по c# – Как я могу передать свойство через лямбда-выражение?

8

В моем проекте есть несколько модульных тестов, в которых мы хотим установить некоторые свойства, которые имеют частные установщики. В настоящее время я делаю это с помощью отражения и этого метода расширения:

public static void SetPrivateProperty(this object sourceObject, string propertyName, object propertyValue)
{
    sourceObject.GetType().GetProperty(propertyName).SetValue(sourceObject, propertyValue, null);
}

Предполагая, что у меня был TestObject, как это:

public class TestObject
{
    public int TestProperty{ get; private set; }
}

Затем я могу вызвать это в моих модульных тестах следующим образом:

myTestObject.SetPrivateProperty("TestProperty", 1);

Однако я хотел бы проверить правильность имени свойства во время компиляции, и, таким образом, я хотел бы иметь возможность передать свойство через выражение, например:

myTestObject.SetPrivateProperty(o => o.TestProperty, 1);

Как я могу это сделать?

@mellamokb Да. Если для этого есть другое средство, я играю. Sterno
Увидетьstackoverflow.com/questions/671968/… phoog
Какова цель лямбда-выражения? Чтобы обеспечить проверку во время компиляции? mellamokb

Ваш Ответ

2   ответа
9

то должно работать следующее. Это даст вам метод расширения, который выглядит следующим образом:

var propertyName = myTestObject.NameOf(o => o.TestProperty);

Требуется публичный добытчик. Я надеюсь, что в какой-то момент такая функциональность отражения будет внедрена в язык.

public static class Name
{
    public static string Of(LambdaExpression selector)
    {
        if (selector == null) throw new ArgumentNullException("selector");

        var mexp = selector.Body as MemberExpression;
        if (mexp == null)
        {
            var uexp = (selector.Body as UnaryExpression);
            if (uexp == null)
                throw new TargetException(
                    "Cannot determine the name of a member using an expression because the expression provided cannot be converted to a '" +
                    typeof(UnaryExpression).Name + "'."
                );
            mexp = uexp.Operand as MemberExpression;
        }

        if (mexp == null) throw new TargetException(
            "Cannot determine the name of a member using an expression because the expression provided cannot be converted to a '" +
            typeof(MemberExpression).Name + "'."
        );
        return mexp.Member.Name;
    }

    public static string Of<TSource>(Expression<Func<TSource, object>> selector)
    {
        return Of<TSource, object>(selector);
    }

    public static string Of<TSource, TResult>(Expression<Func<TSource, TResult>> selector)
    {
        return Of(selector as LambdaExpression);
    }
}

public static class NameExtensions
{
    public static string NameOf<TSource, TResult>(this TSource obj, Expression<Func<TSource, TResult>> selector)
    {
        return Name.Of(selector);
    }
}
4

Имя(имущество)

Похожие вопросы