获取通用方法以从运行时类型推断类型参数

时间:2014-01-08 01:17:16

标签: c# generics overloading extension-methods

我有一些抽象基类的扩展方法,比方说Pet,它们自称为接受该类型参数的泛型方法。

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;
    }
}

这对我来说很有用,我可以这样说:

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

所有具有相同的基本实现且没有代码重复。

但我最近发现了一个令人不安的问题!如果我去:

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

我希望行为相同,但现在编译器选择运行PermuteFromData<Pet>,而Deserialize<Pet>依次调用Activator.CreateInstance(typeof(T)),在某些库的内容中,我无法控制尝试去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 }); } - 在尝试创建Abstract类的实例时抛出异常!

我发现的唯一解决方法是呕吐以下代码,以使用运行时类型获取正确的泛型方法:

dynamic

对于上帝的爱,还有其他方法吗?在类中使用带有方法名称的硬编码字符串是不可接受的。

我有一大堆这样的扩展方法,泛型方法需要推断运行时类型,而不是编译时类型。 Someone告诉我,我可以巧妙地使用{{1}}来解决这个问题。是这样吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用dynamic,但我不确定您是否可以使用扩展方法语法执行此操作。

首先试试这个:

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

它应该按预期工作。然后你可以尝试

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

但我不确定它会解决纠正方法。