访问插件实例属性

时间:2016-01-08 02:26:05

标签: c#

我想使用插件扩展我的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()方法时,它会找到它,所以必须有一种方法来使用它。

不同的插件具有不同数量和类型的属性。

1 个答案:

答案 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.

更好的方法是为界面添加所有必要的方法。