2014-06-13 3 views
2

문제점에 대한 해결책을 찾고 있었고 수정 사항을 발견하자마자 작동하지 않습니다. 문제는 내가 CustomAttriburte의 배열을 가지고 있고 각각의 타입을 타입에 따라 다른 메소드로 전달할 수 있도록 실제 타입으로 캐스트하려고합니다. 예 : RangeAttribute 및 DisplayFormatAttribute에 대한 별도의 메서드가 있으며 올바른 메서드를 호출해야합니다.다이내믹 캐스팅 문제

나는 기본 클래스와 2 개의 하위 클래스가 있고 각각 자신의 "DoSomething (T t)"메서드가있는 테스트 콘솔 응용 프로그램을 만들었습니다. 이 메서드를 다음과 같이 실행하면 : "DoSomething (x as dynamic)"내 배열의 각 요소에 적절한 메서드가 호출되었습니다.

다음 작품 :

class Base{} 
class ChildA : Base {} 
class ChildB : Base {} 
class Program { 
    static void Main(string[] args) 
    { 
     Base[] c = { new ChildA(), new Base(), new ChildB() }; 
     Console.Out.WriteLine(DoSomething(c[0] as dynamic)); 
     Console.Out.WriteLine(DoSomething(c[1] as dynamic)); 
     Console.Out.WriteLine(DoSomething(c[2] as dynamic)); 
     Console.ReadLine(); 
    } 
    static string DoSomething(Base b) { return "Base";} 
    static string DoSomething(ChildA c) { return "ChildA";} 
    static string DoSomething(ChildB c) { return "ChildB";} 
} 

이 내가 원하는 출력 결과 : 그래서이 작품

ChildA 
Base 
ChildB 

,하지만 내 실제 응용 프로그램에서 나는 거기에 RuntimeBinderException에게

내 코드를 얻을 is :

class Seeder { 
    public void Seed() { 
       ... 
      CustomAttributeData[] custAtrData = propertyInfo.CustomAttributes.ToArray(); 
      for(int i = 0; i < custAtrData.Length; i++) { 
        custAtrData[i] = Behavior.Bug(custAtrData[i] as dynamic); 
      } 
    } 
} 
class Behavior { 
     public static RangeAttribute Bug(RangeAttribute) {... } 
     public static DisplayAttribute Bug(DisplayAttribute) {...} 
     ... 
} 

예외는 메소드에 대한 최적의 오버로드가 Bug에 잘못된 인수가 있지만 단 하나의 인수가 있으며 인수가 Bug 메소드의 오버로드와 일치하는지 확인했습니다.

그럼 내 테스트 응용 프로그램에서 작동하지만 실제 응용 프로그램에서는 작동하지 않는 이유는 무엇입니까?

+1

'CustomAttributeData'는 원하는 것이 아닙니다. – SLaks

+0

visitor 패턴을 사용하거나 속성의 기본 클래스 또는 인터페이스에서 가상 메소드를 만드는 것을 고려하십시오. – SLaks

답변

6

CustomAttributeData은 어셈블리의 특성에 대한 기본 메타 데이터를 보유하는 별도의 클래스입니다.

실제 속성 코드를 실행하지 않으며 속성 클래스의 인스턴스가 아닙니다.

GetCustomAttributes()을 원하면 실제 속성 클래스를 인스턴스화하고 반환합니다.

또한

, 당신은 그런 dynamic을 사용하지 않아야합니다; 다소 느립니다.

대신 모든 속성을 기본 클래스 또는 인터페이스로 상속 한 다음 속성 클래스 자체에 메소드를 넣고 기본 유형을 통해 직접 호출 할 수 있습니다.

+0

우리는 내장 된 속성을 사용하고 있으며 확장 메서드가 작동하지 않는다고 말했습니다. 확장 메서드가 작동하려면 실제 형식으로 개체를 캐스팅해야하기 때문입니다. – CaffeinatedCM

+0

당신 말이 맞아요. 확장 메서드가 작동하지 않습니다. – SLaks

+1

속성을 상속하고 기본 인터페이스를 추가 할 수 있습니까? – SLaks