这可能吗?
我有一个我一直在制作的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());
我知道上面的代码片段永远不会有效,但我相信它最能反映我的想法。
答案 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)
首先,我要感谢所有回答我问题的人。我接受了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"];