2017-11-27 2 views
2

나는 C#에서 리플렉션 기능을 사용하여 DLL을 사용하고 있습니다. 속성을 설정하고 속성 형식을 대리자 형식으로 설정하려고합니다.속성이 대리자 형식 인 경우 C#에서 리플렉션을 사용하여 속성 값을 설정하는 방법?

리플렉션을 사용하여 속성을 설정하는 단계를 알려주세요.

SetValue 메서드는이 작업을 수행하는 데 사용해야하지만 대리자 형식의 속성을 설정하는 방법을 알지 못합니다.

SetValue (objectName, 1, null)은 리플렉션을 사용하여 정수 속성을 설정하지만 대리자 형식의 속성을 설정하는 방법을 알지 못합니다.

대리자 속성 유형의 변수를 선언하고 리플렉션을 사용하여 초기화하는 방법은 무엇입니까?

+0

* 이벤트 *를 설정/추가 하시겠습니까? 예 : 'Button.Click'? –

답변

2

그것은 같은

class A 
{ 
    public Action Action { get; set; } 
} 

우리는 우리가 캐스팅이 너무

void Main() 
{ 
    var a = new A(); 

    var type = a.GetType(); 

    var delegateProperty = type.GetProperty(nameof(A.Action)); 

    delegateProperty.SetValue(a, (Action)(() => Console.WriteLine("via reflection"))); 

    a.Action(); 
} 

주처럼 반사를 통해 설정할 수있는 위임 속성 클래스 감안할 때

오히려 간단합니다 람다 식을 델리게이트 형식으로 변환하려면 여기 System.Action 형식 유추 컨텍스트가 없기 때문에 중요하지는 않지만 va를 얻는 여러 가지 방법 중 하나 일뿐입니다 델리게이트 유형의 lue.

어떻게 위임 속성 유형의 변수를 선언하고 반사를 사용하여 를 초기화 : 그러나 질문의 ​​두 번째 부분에 우리를 인도 않습니다

?

선언 된 속성과 일치하는 형식의 대리자 값을 만들어야합니다. 이 경우 속성은 System.Action입니다. 대리자가 포함되어있는 경우

var type = typeof(MyClass); 

var action = new Action<object>((o) => Console.WriteLine("Invoked with {0}", o)); 
var obj = new MyClass(); 
type.GetProperty("Simple", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(obj, action); 

: 속성을 설정

public class MyClass 
{ 
    internal Action<object> Simple { get; set; } 
} 

:이 클래스를 가정

: 가장 간단한 수준에서

1

당신은 int 속성을 설정 그것을 같은 방식으로 설정 인자로 public이 아닌 타입은 공분산/반항에 따라 object를 사용하여 설정할 수 있습니다.

가정 : 대리자 형식 자체가 내부 인 경우 Action<object>으로 속성을 설정이며, 다음과 같이 클래스를 가정

여전히 그 내부 대리자 형식의 인스턴스를 만들 필요가

public class MyClass 
{ 
    internal Action<Arg> Simple { get; set; } 
} 
internal class Arg { } 

작동합니다 :

public class MyClass 
{ 
    internal Internal Simple { get; set; } 
} 
internal class Arg { } 

internal delegate void Internal(Arg arg); 

당신은 사용할 수 있습니다

0 12,

참고 : 위의 코드는 작동, 우리는 (인수가 명시 적 캐스팅이 필요하지 않습니다)에 Internal 대표와 호환 될 수있는 대리자 (Action<object>)를 생성하고 새로운을 만들 대리자의 methodInfo을 사용하기 때문에 내부 위임자. 만들려는 위임자 유형에 따라 더 까다로울 수 있지만 더 많은 정보가 없으면 좋은 출발점이되어야합니다.

관련 문제