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);

它说

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

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

4

1 回答 1

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));

我将留给自己一个练习,以弄清楚上面应该在您现有代码中的哪个位置:)

于 2013-10-03T18:24:38.093 回答