2017-01-07 4 views
0

속성 이름을 가진 개체를 람다 매개 변수로 사용하고 전달 된 개체에 사용할 수 있지만 다른 개체에 사용하는 메서드를 작성하려고합니다. 그 메소드 내에서 생성 된 동일한 유형.호출 할 재사용 가능한 속성을 람다에 의해 전달 된

목표는 두 개체에서 동일한 속성을 사용하는 것입니다. 속성 이름은 매개 변수로 메서드에 전달되어야합니다 (람다 식).

(컴파일되지 않습니다) 제가 지금까지 작성한 것을 보여 드리겠습니다 :

개체 사용 : 다른 클래스에서

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

방법은 상기 목적으로 사용되는 :

public class TestClass1 
{ 
    public void DoSomethingOnProperty(Expression<Func<ObjectMy,string>> propertyName) 
    { 
     var object1 = new ObjectMy(); 
     var propertyNameProp = propertyName.Body as MemberExpression; 
     propertyNameProp.Member = "Test string"; // error Member is readonly 

     //DoSomethingOnProperty(object1.thesameproperty...) 

    } 
} 

ObjectMy 인스턴스의 메서드 이름 속성에 "Test string" 을 전달한 다음 ObS의 새 인스턴스 인 DoSomethingOnProperty를 재귀 적으로 호출하려고합니다. ectMy이고 DoSomethingOnProperty에 대한 첫 번째 호출에서 제공된 것과 동일한 특성 이름을 사용하십시오.

나는

DoSomethingOnProperty(obj=>obj.Prop1); 

감사처럼 전화를하고 싶습니다.

+0

처럼 사용할 수 있습니다! .Select (x => DoSomethingOnPropery (x)). 메서드는 DoSomethingOnPropery가 void를 사용하지 않고 값을 반환해야합니다. 그냥 값을 변경하려면 코드를 for 루프에 넣으십시오. – jdweng

+0

그래서'DoSomethingOnProperty'는 여러 객체에서 같은 속성을 수정해야합니까? 그렇다면 '속성 이름'인수 만 있지만 ObjectMy 인수는없는 이유는 무엇입니까? 코드를 나타내는 표현식을 수정하려고합니다. 이 시점에서 전혀 작동하지 않는 'ObjectMy' 인스턴스도 없습니다. –

+0

당신의 문제를 올바르게 이해했다면, 훨씬 더 쉬운 해결책은 set-property 메쏘드를 전달하는 것이므로, 당신의 메쏘드는 원하는만큼 많은 객체에서 그것을 호출 할 수 있습니다 : DoSomethingOnProperty (Action setProperty) {var object1 = 새로운 ObjectMy(); setProperty (object1, "테스트 문자열"); ...}'. 그러면 다음과 같이 호출 할 수 있습니다 :'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

고맙습니다. –