繁体   English   中英

获取泛型方法以从运行时类型推断出类型参数

[英]Getting a generic method to infer the type parameter from the runtime type

我有一些抽象基类的扩展方法,比如说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)) -为尝试创建Abstract类的实例而抛出异常!

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

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

为了上帝的爱,还有别的办法吗? 在类中使用带有方法名称的硬编码字符串是不可接受的。

我有很多这样的扩展方法,其中通用方法需要推断运行时类型,而不是编译时类型。 有人告诉我我可以巧妙地使用dynamic来解决这个问题。 是这样吗?

您可以尝试使用dynamic ,但是我不确定您可以使用扩展方法语法来做到这一点。

首先尝试一下:

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

它应该按预期工作。 那你可以试试

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

但我不确定它将解决正确的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM