访问插件实例属性

本文关键字:属性 实例 插件 访问 | 更新日期: 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.

更好的方法是将所有必要的方法添加到接口中。