문제점에 대한 해결책을 찾고 있었고 수정 사항을 발견하자마자 작동하지 않습니다. 문제는 내가 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 메소드의 오버로드와 일치하는지 확인했습니다.
그럼 내 테스트 응용 프로그램에서 작동하지만 실제 응용 프로그램에서는 작동하지 않는 이유는 무엇입니까?
'CustomAttributeData'는 원하는 것이 아닙니다. – SLaks
visitor 패턴을 사용하거나 속성의 기본 클래스 또는 인터페이스에서 가상 메소드를 만드는 것을 고려하십시오. – SLaks