无法从DLL获取自定义属性列表

时间:2013-10-02 15:09:38

标签: c#-4.0

我有一个小要求,似乎在完成它时遇到了一些麻烦。请知道我是c#的新手,这是给我的一项任务我请求大家帮我最好及时答复我已经越过了这项任务的截止日期。

我有一个dll并且在其中定义了一个自定义属性我希望能够从使用此自定义属性的类中检索所有方法。请注意我必须从引用的内置dll中获取方法名称另一个申请。

以下是更清晰的代码。

我的属性类:

namespace model
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public sealed class Class1: Attribute
    {
        public Class1()
        {}
        public Class1(string helptext)
        { }
        public string HelpText { get; internal set; }
    }
}

使用此属性的类,在构建为DLL后将被提取

private void Form1_Load(object sender, EventArgs e)
    {
       Assembly mydllAssembly = Assembly.LoadFile(@"D:\Windowsservice\BasicMEthods\BasicMEthods\bin\Debug\BasicMEthods.dll");
        Type mydllFormType = mydllAssembly.GetType("BasicMEthods.Transforms",true);
        MemberInfo info = mydllFormType;
         Attribute[] attrs = (Attribute[])info.GetCustomAttributes(true);
            foreach (Attribute  att in attrs)
            {
                 MethodInfo[] myArrayMethodInfo1 = mydllFormType.GetMethods(BindingFlags.Public);
                    for (int i = 0; i < myArrayMethodInfo1.Length; i++)
                    {
                        MethodInfo mymethodinfo = (MethodInfo)myArrayMethodInfo1[i];
                        textBox1.Text = mymethodinfo.ToString();
                    }
            }
        }
}

在代码的这一行引发错误

Attribute[] attrs = (Attribute[])info.GetCustomAttributes(true);

  

“无法加载文件或程序集”模型,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。系统找不到指定的文件。“

正在从指定位置获取dll,我能够在快速监视中看到类转换我不知道为什么会抛出此错误...而且我也不知道如何访问在dll中定义的属性....请帮助

1 个答案:

答案 0 :(得分:0)

这种方法可以解决问题:

private List<MethodInfo> FindMethodsWithAttribute(Type T,Type AT)
{
  var result = new List<MethodInfo>();
  //get all the methods on type T that are public instance methods
    var methods=t.GetMethods(BindingFlags.Public);
//loop them 
foreach (var method in methods)
   {
    //get the list of custom attributes, if any, of type AT
      var attributes = method.GetCustomAttributes(AT);
      if (attributes.Length!=0)    result.AddRange(attributes);
    }
}

并称之为:

var methods = FindMethodsWithAttribute(mydllFormType ,typeof(model));

我会把自己作为练习留给自己,弄清楚上面应该在现有代码中的位置:)