Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中从属性设置StringName中提取类型_C#_Dependency Injection_Ninject - Fatal编程技术网

C# 如何在C中从属性设置StringName中提取类型

C# 如何在C中从属性设置StringName中提取类型,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我正在执行依赖注入 我想把一个接口绑定到一个可以改变的对象上。 我正在做的是建立几个不同的连接,以便它们以相同的方式进行交互。我希望选项指向一个或另一个对象,但我希望可以通过配置来管理它 这就是我的问题 我目前能够做到这一点: kernal.Bind<InterfaceName>().To<ObjectName>(); // This works with no errors 我试图做的是通过属性设置传入ObjectName 像这样的 kernal.Bind<In

我正在执行依赖注入

我想把一个接口绑定到一个可以改变的对象上。 我正在做的是建立几个不同的连接,以便它们以相同的方式进行交互。我希望选项指向一个或另一个对象,但我希望可以通过配置来管理它

这就是我的问题

我目前能够做到这一点:

kernal.Bind<InterfaceName>().To<ObjectName>(); // This works with no errors
我试图做的是通过属性设置传入ObjectName

像这样的

kernal.Bind<InterfaceName>().To<Properties.Settings.Default.ObjectName>();
这当然不起作用,因为它试图将属性设置为类型

这就是我尝试过的

我已经设置了属性ObjectName,然后执行了以下操作

Type myType = Type.GetType(Properties.Settings.Default.ObjectName);

kernal.Bind<InterfaceName>().To<myType>();
我无法解析我的类型


请帮助。

鉴于您使用的语法,我假设您使用的是Ninject

如果是,则需要命名要绑定到的实例:

kernal.Bind<InterfaceName>()
.To<ObjectName>()
.Named(Properties.Settings.Default.ConnectingRepository);
然后,您可以使用以下方式请求:

kernel.Get<InterfaceName>(Properties.Settings.Default.ConnectingRepository);

还有几个例子。

对于泛型,必须在编译时知道类型! 所以不能使用任何类型变量

然而,你想要的是所谓的抽象工厂。不是将InterfaceName注入构造函数,而是注入抽象工厂并在运行时解析/创建它

interfaceFactory.Create(Properties.Settings.Default.ConnectingRepository);

在那里实现您的解析/创建逻辑

他想要的是用一个只在运行时知道的类型配置IoC,因为在他的第二个示例中,他试图使用类型。GetType@sgrassie“ObjectName是我想要得到的,ObjectName无法解析。你和我当时用不同的方式来理解这个问题,@Tseng。我相信他可以通过命名实例实现他想要的@在我的示例中,Demodave是kernel.Get。。可能是ObjectName的一个实例。@sgrassie也许我已经更新了我的代码来澄清,对象名是什么,所以你是说创建一个基于传入内容的通用工厂,然后我设置接口和对象类?我已经为注入创建了工厂,让我看看是否可以通过这种方式传递属性。我仍然有同样的问题。我不能将属性设置为,但我确实喜欢属性的传递,因为它消除了更多的代码。我从来没有说过可以将其设置为。T类型需要在编译时知道。不能在中使用变量。您可以做的是传递一个变量作为函数的参数。对于Ninject,当类型为编译类型时,使用kernel.Get。当不知道编译类型时,必须使用kernel.getTypeSoft,其中T是类名,或者从字符串:kernel.GetType.GetTypeNamespace.Subnamespace.ClassName,…,它将位于工厂内。Create方法,如果您还确保传递的类名实现了所需的接口,我认为您的困惑来自于不理解泛型在C中的工作方式。您应该更多地阅读有关此主题的内容,这是现代OOP的基本知识。我曾尝试过typeofProperties.Settings.Default.ObjectName,但它不喜欢它