추상 기본 클래스에 대한 확장 메서드가 있는데, 그 자체가 해당 형식 매개 변수를 사용하는 제네릭 메서드를 호출하는 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 });
}
을, 다른 방법은 무엇입니까? 클래스의 메소드 이름과 함께 하드 코딩 된 문자열을 갖는 것은 용납 될 수 없습니다.
일반적인 메소드가 컴파일 타임 유형이 아닌 런타임 유형을 추론해야하는 곳에서 확장 메소드가 많이 있습니다. Someone은 dynamic
의 영리한 사용으로이 문제를 해결할 수 있다고 말했습니다. 그래?
나를 찾았습니다. :) – Alain