2013-08-24 1 views
1

I가 문제의 경우에 Reflection.Emit를파라미터 불일치 (복싱 진수?)

void IPropertyCreator.AddAttribute<T>(params object[] args) 
{ 
    // Convert args to types 
    var argTypes = new Type[args.Length]; 
    for (int i = 0; i < args.Length; ++i) 
    { 
     argTypes[i] = args[i] != null ? args[i].GetType() : null; 
    } 
    // Get constructor 
    var ctorInfo = typeof(T).GetConstructor(argTypes); 

    // Create custom attribute 
    var attrBuilder = new CustomAttributeBuilder(ctorInfo, args); 
    _propertyBuilder.SetCustomAttribute(attrBuilder); 
} 

을 이용하여 인터페이스를 생성하는 시스템의 일부로서, I가 속성에 다음 코드를 작성하고있다 (생성자 단일 object 파라미터 인수 복용와 T typeparam)는 속성이있는 decimal (전용)은 다음 생성자

public DefaultValueAttribute(object value) 
,

이 코드는 모든 POD 유형 (byte, char, int 등) 및 string과 잘 작동하지만 decimal을 사용할 때 오류가 발생합니다. CustomAttributeBuilder의 생성자가 예외가 발생하여 실패합니다. "인덱스 0에서 전달 된 인수 값이 매개 변수 유형"과 일치하지 않습니다.
args
ctorInfoSystem.Decimal 올바르게 오브젝트 파라미터를 취하는 (만) 생성자를 선택한 object{decimal}
argTypes 한 요소 유형이 유형의 하나 개의 원소 = 가지고

디버깅 예상대로 모든 변수임을 나타낸다.

나는 특성이 바로 소수 파라미터를 전달하여 인스턴스화 될 수 있음을 증명하고있다 : I는 object없고 취지 System.Decimal에 소수 변환 시도

decimal val = 123.456M; 
var attr = new DefaultValueAttribute(val); 

. 이 문제는 decimal이 POD 유형이 아니라 구조라는 사실과 관련이 있다고 생각됩니다.

속성에 생성자 오버로드를 추가하려고 시도했습니다 (유형은 decimal입니다). 위 함수가 새 생성자를 올바르게 가져 왔지만 예외가있는 동일한 위치에서 실패했습니다. "잘못된 유형이 사용자 정의 속성 생성자 인수, 필드 또는 속성으로 사용되었습니다."

아무도 아이디어가 없습니다. 이 문제를 해결할 수 있을까요?

답변

4

그냥 일반 C# 코드에서 이것을 작성하려고 :

class TestAttribute : Attribute { 
    public TestAttribute(object value) { } 
} 

[Test(1.2m)]   // NOTE: CS0182 
class Example { } 

당신은 단순히 속성 생성자 인수 System.Decimal를 사용할 수 없습니다. 더블은 괜찮아. C# 언어 사양 의 17.1.3 절에서는 문제에서이라는 힌트를 표시하지만이 특정 사례에 대해서는 너무 구체적이지 않습니다. System.Decimal은 표준 값 유형의 하위 단계입니다. 예를 들어 Ecma 335에는 언급되지 않았습니다. C# 컴파일러는 기본 유형처럼 보이지만 CLR은이를 동일한 방식으로 처리하지 않습니다.