2017-01-07 10 views
0

Я пытаюсь написать метод, который бы взял объект с именем свойства в качестве параметра лямбда, и использовать его на переданном объекте, но также использовать его на другом, новом объекте тот же тип, созданный внутри этого метода.C# свойство многократного использования, которое будет вызываться передано lambda

Цель состоит в том, чтобы использовать одно и то же свойство на обоих объектах. Имя свойства должно передаваться в качестве параметра методу (лямбда-выражение).

Позвольте мне показать, что я написал до сих пор (не компилируется):

Объект будет использоваться:

public class ObjectMy 
{ 
    public string Prop1 {get; set;} 
} 

метод в другом классе для использования с выше объекта:

Я хочу установить переданное в имени метода свойство экземпляра объекта ObjectMy для «Test string» , а затем рекурсивно вызвать DoSomethingOnProperty на другом, новом экземпляре Obj ectMy, и используйте то же имя свойства, что и в первом вызове DoSomethingOnProperty.

Я хотел бы назвать это как

DoSomethingOnProperty(obj=>obj.Prop1); 

Спасибо.

+0

задом !!! .Выберите (x => DoSomethingOnPropery (x)). Метод должен DoSomethingOnPropery возвращать значение, а не использовать void. Если вы просто хотите изменить значение, тогда введите код в цикл for. – jdweng

+0

Итак, 'DoSomethingOnProperty' должен изменить одно и то же свойство в нескольких объектах? Тогда почему он имеет только аргумент «имя свойства», но не аргумент «ObjectMy»? Вы пытаетесь изменить выражение, представляющее собой код. В этот момент нет даже экземпляра 'ObjectMy' для работы вообще. –

+0

Если я правильно понимаю вашу проблему, гораздо проще было бы передать метод set-property, поэтому ваш метод может вызывать его как можно больше объектов: 'DoSomethingOnProperty (Action setProperty) {var object1 = new ObjectMy(); setProperty (object1, "Test string"); ...} '. Затем это можно назвать следующим: 'DoSomething ((obj, value) => {obj.Prop1 = value;})'. –

ответ

0

Попробуйте изменить способ, как это:

public void DoSomethingOnProperty<T>(Expression<Func<T, dynamic>> propertyName) where T : class, new() 
    { 
     var object1 = Activator.CreateInstance(typeof(T)); 
     var methodName = (propertyName.Body as MemberExpression).Member.Name; 
     var propertyInfo = typeof(T).GetProperty(methodName); 
     typeof(T).GetProperty(methodName).SetValue(object1, Convert.ChangeType("Test string", propertyInfo.PropertyType)); 

     //DoSomethingOnProperty(object1.thesameproperty...) 

    } 

вы можете использовать его как

DoSomethingOnProperty<ObjectMy>(x => x.Prop1); 
+0

Спасибо, это здорово! –