如何将对象强制转换为泛型类型
本文关键字:转换 泛型类型 对象 | 更新日期: 2023-09-27 17:59:37
我有许多实现IBuilder<>的类界面,如下方的界面
更新:每个Model1、Model2…都继承自IModel
public class A : IBuilder<Model1>
{
public Model1 Create(string param)
{
return new Model1();
}
}
public class B : IBuilder<Model2>
{
public Model2 Create(string param)
{
return new Model2();
}
}
我正在使用StructureMap注册所有继承IBuilder<>的类
Scan(x =>
{
x.TheCallingAssembly();
x.AddAllTypesOf(typeof(IViewModelBuilder<>));
});
更新
现在,每次我需要获得一些模块的模型时,我都调用Do函数
public IModel Do(Module module)
{
//ModelSettings is taken from web.config
var builderType = Type.GetType(string.Format("{0}.{1}ModelBuilder,{2}", ModelSettings.Namespace, module.CodeName, ModelSettings.Assembly));
var builder = ObjectFactory.GetInstance(t) as IViewModelBuilder<>;
return builder.Create("");
}
我在ObjectFactory.GetInstance(t) as IViewModelBuilder<>
行中得到编译错误。许多帖子建议创建NOT通用接口(IViewModelBuilder),并让通用接口继承它
ObjectFactory.GetInstance(t) as IViewModelBuilder
这是唯一的路吗?
感谢
Do
和GetInstance
的代码也应该是通用的。基本上,它可能看起来像这个
public T Do<T> ()
{
return ObjectFactory.GetInstance<T>().Create();
}
你不能让Do()
通用吗?
var m = Do<B>();
public T Do<T>()
{
var builder = (IViewModelBuilder<T>)ObjectFactory.GetInstance(typeof(T));
return builder.Create("");
}
如果你不能,使用非通用接口可能是你最好的选择,但还有其他选择,比如使用反射或C#4的dynamic
:
var m = Do(typeof(B));
public object Do(Type t)
{
dynamic builder = ObjectFactory.GetInstance(t);
return builder.Create("");
}
我唯一能想到的就是创建一个接口或基类,让视图模型从中继承。I.e:
public class Model1 : ModelBase
{
}
public class ModelBase
{
}
public ModelBase Do(Type t)
{
var builder = ObjectFactory.GetInstance(t);
return t.GetMethod("Create").Invoke(builder, new object[] { "" }) as ModelBase;
}
如果要在非通用场景中调用非通用IViewModelBuilder
接口,则需要引入该接口。通用IViewModelBuilder<T>
将实现IViewModelBuilder
。
唯一的另一种选择是通过反射调用create方法,但我不明白为什么这会更可取:
var builder = ObjectFactory.GetInstance(builderType);
var method = builderType.GetMethod("Create");
return (IModel) method.Invoke(builder, new[]{""});