gpt4 book ai didi

c# - 在 MEF 的泛型方法中转换类

转载 作者:太空狗 更新时间:2023-10-29 23:49:00 27 4
gpt4 key购买 nike

我有一些类和接口(interface):

interface IAnimal { }
interface ILiveInZoo { }
class Cat : IAnimal, ILiveInZoo { }

此外,我还有一些方法和泛型方法:

class Context
{
private static CompositionContainer Container = null;

public ILiveInZoo GetWhoLivesInZoo(string name)
{
if (name == "Cat")
return new Cat();
return null;
}

public void GiveFood<T>(T animal) where T : IAnimal
{
var methods = Container.GetExports<Action<T, EventArgs>, AttributeMetadata>();
//execute methods
}
}

这是一个用例:

Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
context.GiveFood(animal);
}

正如您在 GiveFood 方法中所见,我正在使用 MEF。在我将 cat 转换为 IAnimal 的用例中,在 GiveFood 方法中 typeof(T) 将是 IAnimal 不是 Cat。第一个问题是:cat 变量的实例是 Cat 类。为什么当我施放它时,typeof(T) 会是 IAnimal?我的问题是当我将 cat 转换为 IAnimal 接口(interface)时,在 GiveFood 方法中,GetExports 方法返回与 IAnimal 不是 Cat 类。我找到了解决该问题的解决方案,它正在使用反射:

Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
MethodInfo method = typeof(Context).GetMethod(nameof(Context.GiveFood));
MethodInfo generic = method.MakeGenericMethod(animal.GetType());
generic.Invoke(context, new object[] { animal });
}

现在 typeof(T)Cat 类,在 GiveFood 中我可以获得与 Cat 类相关的方法.有没有另一种方法(不使用反射)来解决这个问题?

最佳答案

一个简单易用的解决方案可能是使用 dynamic :

Context context = new Context();
var cat = context.GetWhoLivesInZoo("Cat");
if (cat is IAnimal animal)
{
context.GiveFood((dynamic)animal);
}

但是请注意,dynamic 在内部使用反射(通过缓存使其性能更高)。因此,如果您真的想避免反射,另一个答案中描述的访问者模式可能是可行的方法。

关于c# - 在 MEF 的泛型方法中转换类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com