GetMethods与GetCustomAttributes

时间:2015-05-20 15:19:58

标签: c# reflection custom-attributes

情况: 目前,我正在阅读特定类中带有反射的所有可用函数和方法。类中的所有函数都有一个像这样的属性部分

[ImportFunctionAttribute("myFunction1", 1, ImportAttribute.SourceType.Type1)]
public ImportStatusDetails myFunction1()
{
}

[ImportFunctionAttribute("myFunction2", 2, ImportAttribute.SourceType.Type2)]
public ImportStatusDetails myFunction2()
{
}

要获取给定类中的所有方法,我使用此代码

// get the public methods out of import class order by class name
var importMethods = (typeof (Import)).GetMethods(
                BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);

问题: 使用GetMethods-Method将为我提供这两个函数 - 但我只想获得类型为ImportAttribute.SourceType.Type2的方法。

问题: 是否可以限制给定CustomAttributes的GetMethods-Method的结果,例如使用GetMethods(...)。Where()??我该怎么做才能解决这个问题?

加法1

public class ImportFunctionAttribute : Attribute
    {
        public enum SourceType
        {
            Unknown = 0,
            Type1 = 1,
            Type2 = 2
        }

        public ImportFunctionAttribute(string psTabName, int pnTabId, SourceType pSourceType)
        {
            tabName = psTabName;
            tabId = pnTabId;
            source = pSourceType;
        }
        protected string tabName;
        protected int tabId;
        protected SourceType source;
        public string TabName { get { return tabName; } }
        public int TabId { get { return tabId; } }
        public SourceType Source { get { return source; } }
    }

提前致谢。

1 个答案:

答案 0 :(得分:0)

我相信你正在寻找GetCustomAttributes(...)。

var methods = new List<MethodInfo>();
var importMethods = (typeof (Import)).GetMethods(
            BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly));

for (var i = 0; i < importMethods.Length; i++) 
{
    var attr = importMethods[i].GetCustomAttributes(typeof(ImportFunctionAttribute), false).Cast<ImportFunctionAttribute>();
    if (attr.Source == SourceType.Type2)
    {
        methods.Add(importMethods[i]);
    }
}