2012-06-14 2 views
1

리플렉션을 통해 속성에 값을 할당해야하며 유형이 System.Reflection.Missing 인 경우를 제외하고는 지금까지 테스트 된 모든 경우에 문제가 없었습니다. 예를 들어,이 클래스입니다 :리플렉션을 통해 System.Reflection.Missing 속성을 할당하면 예외가 발생합니다.

public class SomeClass 
{ 
    public System.Reflection.Missing MissingProp { get; set; } 
} 

그리고이 반사를 통해 속성에 할당하는 코드입니다 :

var inst = new SomeClass(); 
var prop = typeof (SomeClass).GetProperty("MissingProp"); 
prop.SetValue(inst, Missing.Value, null); 

을 그리고 이것은 내가 받고있어 예외 :

System.ArgumentException: Missing parameter does not have a default value. 
Parameter name: parameters 
    at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) 
    at ClassesWithNoProperties.Program.Main(String[] args) in D:\Documents\Documents\Visual Studio 2010\Projects\C#\ClassesWithNoProperties\ClassesWithNoProperties\Program.cs:line 24 

동일한 코드를 사용하여 속성에 값을 할당하는 경우가 너무 많아서이 라이브러리를 테스트 한 결과,이 동작이 관찰되는 유일한 경우입니다 (System.Reflection.Missing).

C#에서 이러한 종류의 할당을 어떻게 성취합니까?

답변

0

오류 메시지는 매우 자명하지만 Missing.Value는 선택적 매개 변수가있는 메서드에서만 자리 표시 자로 사용할 수 있습니다. PropertyInfo를 사용하여 인스턴스의 값을 설정하는 메서드에서이 메서드를 사용하면 간단하게 이해할 수 없으며 Missing.Value는이를 알고 있기 때문에 예외를 throw합니다.

이상하게도 VB.Net은 기본 매개 변수를 지원하므로 VB.Net을 사용하면이 기능을 사용할 수 있습니다. C#은 그렇지 않습니다.

+0

C#에서 이러한 종류의 할당을 어떻게 성취합니까? –

+0

간단히 말해서, 당신은 할 수 없습니다. 모든 메서드에서 Missing.Value를 매개 변수로 전달함으로써 "Missing.Value"를 해당 매개 변수의 기본값이되는 값으로 바꾸도록 컴파일러에 지시합니다. 따라서 Missing.Value를 prop.SetValue 호출에서 value 매개 변수로 전달하면 SetValue 메서드 시그니처의 value 매개 변수에 대한 기본값이 없으므로 코드가 실패하게됩니다. –

관련 문제