C# 解决简单喷油器的通用接口问题

C# 解决简单喷油器的通用接口问题,c#,generics,dependency-injection,simple-injector,C#,Generics,Dependency Injection,Simple Injector,想知道是否有可能实现以下目标: container.GetInstance<IWordFacade<,,,>>(); container.GetInstance(); 到目前为止我还没能做到。以下是一些代码示例: IWordFacade<T1,T2,T3,T4>{ T1 DoSomething(T2); } public class ConcreteFacade1 : IWordFacade<int,long,double,decimal&

想知道是否有可能实现以下目标:

container.GetInstance<IWordFacade<,,,>>();
container.GetInstance();
到目前为止我还没能做到。以下是一些代码示例:

IWordFacade<T1,T2,T3,T4>{
    T1 DoSomething(T2);
}

public class ConcreteFacade1 : IWordFacade<int,long,double,decimal>{
    int DoSomething(long param){
        //....
    }
}

public class ConcreteFacade2 : IWordFacade<short,string,float,char>{
    short DoSomething(string param){
        // ...
    }
}
IWordFacade{
T1剂量测定法(T2);
}
公共类混凝土立面1:IWordFacade{
int剂量测量(长参数){
//....
}
}
公共类混凝土立面2:IWordFacade{
短剂量测量(字符串参数){
// ...
}
}
。。。给定这些类型/类,我试图找到一些东西,使我能够根据容器如何配置来解析接口(这就是我遇到的问题)返回ConcreteFacade1或2

我试过:

container.Register(typeof(IWordFacade<,,,>), typeof(ConcreteFacade1));
container.Register(typeof(IWordFacade),typeof(ConcreteFacade1));

导致以下错误:IWordFacade不是已注册的开放泛型类型。

您提供的代码不是有效的C#,将无法编译。不能在<和>标记中指定打开的泛型类型。您必须指定一个封闭的泛型类型。但是,以下是有效的C#:

通过这种方式,您可以进行以下注册:

contianer.Register<IWordFacade, ConcreteFacade1>();

您希望容器返回给您的类型是什么?你能提供更多的上下文吗?我想根据容器的配置,选择其中一种具体的外观类型。。。这取决于特定的app.config配置,并在运行时确定。感谢steven的帮助-对于注册开始时的输入错误,我深表歉意(我是从mem快速输入的)。无论如何。。。我真的不想在调用container.GetInstance()时提供泛型类型。所以,我所做的就是使用一些.net方法来实现我想要的东西嘿,史蒂夫,谢谢你的更新-这正是我想要做的,也是我最终实现的,因为没有其他方法来实现这一点。不幸的是,我不得不在多个地方调用GetInstance()方法(word addin),不希望维护变成一场噩梦。感谢您的洞察力和写作,节省了我的时间:)这是在ASP.NET应用程序中使用的正确方法吗。GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(MyApp.ILogger))。谢谢。@Dilhan如果没有适当的上下文,这个问题是不可能回答的。您可能想尝试在此处发布一个新问题。
container.Register(typeof(IWordFacade<,,,>), typeof(WordImpl<,,,>));
container.GetInstance<IWordFacade<Foo, Bar, FooBar>>();
container.GetInstance(typeof(IWordFacade<Foo, Bar, FooBar>));
interface IWordFacade {
    object DoSomething(object value);
}
contianer.Register<IWordFacade, ConcreteFacade1>();
container.GetInstance<IWordFacade>();
public abstract class WordFacadeBase<T1, T2, T3, T4> : IWordFacade<T1, T2, T3, T4> {
    public abstract T1 DoSomething(T2 value);
    object IWordFacade.DoSomething(object value) {
        return DoSomething(T2)value);
    }
}