sto*_*oic 48 c# reflection custom-attributes
我有一个自定义属性:
public class MenuItemAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
和一个有几个方法的类:
public class HelloWorld
{
[MenuItemAttribute]
public void Shout()
{
}
[MenuItemAttribute]
public void Cry()
{
}
public void RunLikeHell()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如何只获取使用自定义属性修饰的方法?
到目前为止,我有这个:
string assemblyName = fileInfo.FullName;
byte[] assemblyBytes = File.ReadAllBytes(assemblyName);
Assembly assembly = Assembly.Load(assemblyBytes);
foreach (Type type in assembly.GetTypes())
{
System.Attribute[] attributes = System.Attribute.GetCustomAttributes(type);
foreach (Attribute attribute in attributes)
{
if (attribute is MenuItemAttribute)
{
//Get me the method info
//MethodInfo[] methods = attribute.GetType().GetMethods();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在需要的是获取方法名称,返回类型以及它接受的参数.
SLa*_*aks 85
你的代码是完全错误的.
您循环遍历具有该属性的每个类型,该类型将找不到任何类型.
您需要遍历每种类型的每个方法,并检查它是否具有您的属性.
例如:
var methods = assembly.GetTypes()
.SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
Jor*_*ean 21
Dictionary<string, MethodInfo> methods = assembly
.GetTypes()
.SelectMany(x => x.GetMethods())
.Where(y => y.GetCustomAttributes().OfType<MethodAttribute>().Any())
.ToDictionary(z => z.Name);
Run Code Online (Sandbox Code Playgroud)
小智 6
var classType = new ClassNAME();
var methods = classType.GetType().GetMethods().Where(m=>m.GetCustomAttributes(typeof(MyAttribute), false).Length > 0)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
现在您MyAttribute在 class 中拥有了具有此属性的所有方法classNAME。您可以在任何地方调用它。
public class ClassNAME
{
[MyAttribute]
public void Method1(){}
[MyAttribute]
public void Method2(){}
public void Method3(){}
}
class MyAttribute: Attribute { }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45653 次 |
| 最近记录: |