我想使用插件扩展我的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
}
}
我想访问&#34;信息&#34;为该特定实例获取/设置它的属性。当我使用getproperties()方法时,它会找到它,所以必须有一种方法来使用它。
不同的插件具有不同数量和类型的属性。
答案 0 :(得分:0)
由于Info
属性不是界面的一部分,您必须使用反射(Set object property using reflection)或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.
更好的方法是为界面添加所有必要的方法。