访问插件实例属性
本文关键字:属性 实例 插件 访问 | 更新日期: 2023-09-27 18:29:23
我想使用插件来扩展我的c#wpf应用程序。我制作了一个简单的接口,然后是一个插件dll,然后是加载插件的测试类。插件加载正确,我可以得到它的属性列表。
界面:
public interface IStrat
{
string Name { get; }
void Init();
void Close(int dat);
}
插件:
public class Class1 : IStrat
{
public string info;
[Input("Info")]
public string Info
{
get
{
return info;
}
set
{
info = value;
}
}
public string Name
{
get { return "Test Strategy 1"; }
}
public void Init()
{
}
public void Close(int dat)
{
}
}
测试类别:
class test
{
public void getPlugins()
{
Assembly myDll = Assembly.LoadFrom(Class1.dll);
var plugIn = myDll.GetTypes();
List<string> temp = new List<string>();
//gets the properties with "input" attribute, it returns the Info property fine
var props = item.GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(Input)));
foreach (var prop in props)
{
temp.Add(prop.Name + " (" + prop.PropertyType.Name + ")");// returns Info (string)
}
stratFields.Add(item.Name, temp);// stratFields is a dictionary that keeps the name of the plugin as key and a list of properties names as value
}
public void create()
{
//create an instance of my plugin
Type t = plugIn[0];
var myPlugin = (IStrat)Activator.CreateInstance(t);
myPlugin.Init(); // this works, i can access the methods
myPlugin.Info = "test"; //this doesn't work
}
}
我想访问"Info"属性以获取/设置该特定实例的信息。当我使用getproperties()方法时,它会找到它,所以必须有一种方法来使用它。
不同的插件具有不同数量和类型的属性。
由于Info
属性不是接口的一部分,因此必须使用反射(使用反射设置对象属性)或dynamic
:
myPlugin.Init(); // this works because IStrat has Init method
dynamic plugin = myPlugin;
plugin.Info = "test"; // this works because `Info` is public property and
// dynamic will perform late (run-time) binding.
更好的方法是将所有必要的方法添加到接口中。