2014-01-08 3 views
2

추상 기본 클래스에 대한 확장 메서드가 있는데, 그 자체가 해당 형식 매개 변수를 사용하는 제네릭 메서드를 호출하는 Pet이라고 가정 해 보겠습니다.런타임 형식에서 형식 매개 변수를 추론하는 제네릭 메서드 가져 오기

Dog newDog = existingDog.PermuteFromData(dogData); 
Cat newCat = existingCat.PermuteFromData(catData); 

그리고 같은 기본 구현없이 코드 중복 모든 : 내가 좋아하는 일을 말할 수

public static Pet_ExtensionMethods 
{ 
    public static T PermuteFromData<T>(this T thisPet, string data) where T : Pet 
    { 
     T newPet = new SomeDeserializer().Deserialize<T>(data); 
     newPet.someProperty = thisPet.someProperty; 
     return newPet; 
    } 
} 

은 나를 위해 큰 일했다.

하지만 최근에는 불안한 문제를 발견했습니다. 내가 갈 경우

Pet myPet = existingDog; 
string petData = dogData; 
Pet newPet = myPet.PermuteFromData(petData); 

내가 원하는 동작은 동일합니다,하지만 지금 컴파일러는 결국 일부 라이브러리의 창자에 내가 갈 시도를 제어하지 않는, Deserialize<Pet>을 호출하는 PermuteFromData<Pet>를 실행 선출한다 Activator.CreateInstance(typeof(T)) - Abstract 클래스의 인스턴스를 만들려고 할 때 Exception을 던졌습니다!

내가 찾은 유일한 해결 방법은 런타임 타입 사용하여 올바른 일반적인 방법을 얻을 수있는 다음과 같은 코드를 토해하는 것입니다 하나님의 사랑을 위해

public static T PermuteFromDataFix<T>(this T thisPet, string data) where T : Pet 
{ 
    return (T) typeof(Pet_ExtensionMethods).GetMethod("PermuteFromData") 
     .MakeGenericMethod(new Type[] { thisPet.GetType() }) 
     .Invoke(null, new object[] { thisPet, data }); 
} 

을, 다른 방법은 무엇입니까? 클래스의 메소드 이름과 함께 하드 코딩 된 문자열을 갖는 것은 용납 될 수 없습니다.

일반적인 메소드가 컴파일 타임 유형이 아닌 런타임 유형을 추론해야하는 곳에서 확장 메소드가 많이 있습니다. Someonedynamic의 영리한 사용으로이 문제를 해결할 수 있다고 말했습니다. 그래?

답변

1

dynamic을 사용해 볼 수도 있지만 확장 방법 구문을 사용하여이 작업을 수행 할 수 있는지 확신 할 수 없습니다. 예상대로

Pet_ExtensionMethods.PermuteFromData((dynamic)pet, petData); 

그것은 작동합니다 :

먼저이 일을보십시오. 그럼 시도해 볼 수 있습니다

((dynamic)pet).PermuteFromData(petData); 

하지만 해결 방법이 확실하지 않습니다.

+0

나를 찾았습니다. :) – Alain

관련 문제