如何将对象转换为泛型类型?

时间:2011-06-20 22:49:04

标签: c# .net structuremap

我有很多类实现 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&lt;&gt;

的类
Scan(x =>
{
       x.TheCallingAssembly();
       x.AddAllTypesOf(typeof(IViewModelBuilder<>));                
});

已更新

现在,每当我需要获得某些模块的模型时,我会调用执行功能

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

这是唯一的方法吗?

谢谢

4 个答案:

答案 0 :(得分:5)

DoGetInstance的代码也应该是通用的。基本上它看起来像这样

public T Do<T> ()
{
     return ObjectFactory.GetInstance<T>().Create();
}

答案 1 :(得分:2)

你不能让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("");
}

答案 2 :(得分:1)

我唯一能想到的是你创建了一个你的viewmodel继承的接口或基类。即:

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

答案 3 :(得分:1)

如果要在非通用方案中调用它,则需要引入非通用IViewModelBuilder接口。通用IViewModelBuilder<T>将实现IViewModelBuilder

唯一的另一种选择是通过反射来调用create方法,但我不明白为什么这会是首选:

var builder = ObjectFactory.GetInstance(builderType);
var method = builderType.GetMethod("Create");
return (IModel) method.Invoke(builder, new[]{""});