gpt4 book ai didi

c# - 泛型的多次分派(dispatch)

转载 作者:行者123 更新时间:2023-11-30 22:20:37 25 4
gpt4 key购买 nike

我试图通过使用泛型提供工厂/构建器来抽象出我的接口(interface)实现。但是,我在运行时遇到了多重分派(dispatch)和 C# 泛型的问题,它正在做一些看起来很奇怪的事情。

基本场景是我定义了几个接口(interface):

public interface IAddressModel
{
}

public interface IUserModel
{
}

然后我有一个工厂类来返回实际的实现:

public class Factory
{
public T BuildModel<T>()
{
return BuildModel(default(T));
}

public object BuildModel(object obj)
{
//this is here because the compiler will complain about casting T to
//the first inteface parameter in the first defined BuildModel method
return null;
}

public IAddressModel BuildModel(IAddressModel iModel)
{
//where AddressModel inherits from IAddressModel
return new AddressModel();
}

public IUserModel BuildModel(IUserModel iModel)
{
//where UserModel inherits from IUserModel
return new UserModel();
}
}

问题是当工厂被这样调用时:new Factory().BuildModel<IAddressModel>()在运行时从泛型调度的 BuildModel(...) 方法始终是 T 的最少派生形式,在本例中始终是对象。

但是,如果您调用 new Factory().BuildModel(default(IAddressModel));分配了正确的方法(很可能是因为这是在编译时完成的)。似乎使用泛型的动态分派(dispatch)不会检查大多数派生类型的方法,即使调用的方法应该是相同的,无论它是在编译时还是运行时完成的。理想情况下,我想将 BuildModel(...) 方法设为私有(private)并且只公开通用方法。还有另一种方法可以让动态调度在运行时调用正确的方法吗?我试过更改 BuildModel<>()实现到 return BuildModel((dynamic)default(T))但这会引发运行时错误,即无法确定要分派(dispatch)的方法。有没有一种方法可以通过逆变和更多接口(interface)来做到这一点?

最佳答案

您可以根据参数类型 T 自己进行调度:

public class Factory
{
private Dictionary<Type, Func<object>> builders = new Dictionary<Type, Func<object>>
{
{ typeof(IAddressModel), BuildAddressModel },
{ typeof(IUserModel), BuildUserModel }
};

public T Build<T>()
{
Func<object> buildFunc;
if (builders.TryGetValue(typeof(T), out buildFunc))
{
return (T)buildFunc();
}
else throw new ArgumentException("No builder for type " + typeof(T).Name);
}

private static IAddressModel BuildAddressModel()
{
return new AddressModel();
}

private static IUserModel BuildUserModel()
{
return new UserModel();
}
}

关于c# - 泛型的多次分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840931/

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