使用字符串引用DLL类

时间:2016-02-28 05:44:56

标签: c#

这可能吗?

我有一个我一直在制作的DLL,它是一个名为ModbusClient的类,另一个名为ModbusRTU。在另一个应用程序中,我添加以下代码。

ModbusClient Client = new ModbusClient(new ModbusRTU());

它有效,但现在我要做的是从三个字符串动态添加客户端!如下面的代码。

string string1 = "Modbus";
string string2 = "Client";
string string3 = "RTU";

string1+string2 Client = new string1+string2(new string1 + string3());

我知道上面的代码片段永远不会有效,但我相信它最能反映我的想法。

3 个答案:

答案 0 :(得分:5)

你可以使用反射..

$( ".listing" ).click(function() {
   var list_id = $(this).find(".id_align" ).val(); // to fetch current current id_align
   var location = "/create_review/" + list_id;
  window.location.href = location;
});

答案 1 :(得分:1)

-UPDATE -

首先,我要感谢所有回答我问题的人。我接受了Viru的建议并使用了“GetType”方法。起初它没有用,但我能够稍微调整一下以获得理想的效果。这就是它现在的样子,并且非常适合我需要的东西。顺便说一句,DataExchange.Modbus是我在原始帖子中引用的DLL名称。

string string1 = "Modbus";
string string2 = "Client";
string string3 = "RTU";
var modbusClientType = Type.GetType("DataExchange.Modbus." + string1 + string2 + ",DataExchange.Modbus");
var modbusRtuType = Type.GetType("DataExchange.Modbus." + string1 + string3 + ",DataExchange.Modbus");

var modbusRtuInstance = Activator.CreateInstance(modbusRtuType);
var Client = Activator.CreateInstance(modbusClientType, modbusRtuInstance);

在这样做之后,我开始摸索如何获取和设置属性,字段和运行方法。我环顾了一会儿,发现再次使用System.Reflection就像Viru建议一样。

//Type
var t = Client.GetType();

//Properties "Changes the name property of Client"
PropertyInfo Client_Name = t.GetProperty("Name");
Client_Name.SetValue(Client, "NEW NAME");

//Registers "Gets an array from the Client"
FieldInfo Registers = t.GetField("Registers");
Array arr = (Array)Registers.GetValue(Client);
Label_Register1.Text = String.Format("0x{0:x4}", arr.GetValue(246));
Label_Register2.Text = String.Format("0x{0:x4}", arr.GetValue(247));

//Mothods "Executes a method with parameters {_portClient to , 1 }"
MethodInfo method = t.GetMethod("Execute");
method.Invoke(Client, new object[] { _portClient, Convert.ToByte(1), Convert.ToByte(4), 247, 2, 1 });

我希望这可以帮助别人!再次感谢所有发布的人!

答案 2 :(得分:0)

使用字典或其他集合来保留动态创建对象的引用,如下所示。如果你想要的是真正的动态代码,你将不得不利用Roslyn,或使用一些脚本沙箱。

var dictClients = new Dictionary<string, ModbusClient>();

dictClients.Add("SomeKey", new ModbusClient(new ModbusRTU()));

var someClient = dictClients["SomeKey"];