从委托中获取基础类的类型

时间:2016-07-10 16:52:20

标签: c# .net types

我有一些继承相同接口IParsee的类。它们都具有[Regex]属性。我需要创建一个Parser类,我传递一个字符串和一个委托数组来解析给定的字符串并返回一个IParsee个对象的数组。问题是我希望保持代码干燥,而不是在每个IParsee类中编写匹配字符串的方法,但我想在Parser类中编写它。我不知道如何通过它的方法获得类的类型。我看到我可以在方法上调用GetType(),但如果给出了一个错误的解析字符串,我的方法会抛出错误。

Parser中的方法:

public class Parser
{
    public static List<IParsee> Parse(String text, params Func<String, IParsee>[] meth)
{
        List<IParsee> list = new List<IParsee>();
        IParsee res;
        for (int i = 0; i < meth.Length; i++)    
            // here i want to get the regex attribute and the MatchCollection
            // looping through the MatchCollection parsing 
            // every match and pushing it to the list

        return list;
}

我需要解析的类中的方法:

[RegexAttribute(@"\w+\s\w+\swas\sborn\son\s(\d{4}/\d\d/\d\d)"]
public class Person : IParsee
{
   public static IParsee Parse(string str)
   {

所以我称之为

List<IParsee> l = Parser.Parse(person.ToString(), Person.Parse);

2 个答案:

答案 0 :(得分:1)

您可以使用传递方法的声明类型:

for (int i = 0; i < meth.Length; i++)
{
    RegexAttribute attribute = meth[i].GetMethodInfo().DeclaringType
                                .GetCustomAttribute<RegexAttribute>();

    // assume you have a property called YourStringProperty in RegexAttribute
    string regexAttributeValue = attribute.YourStringProperty;
}

DeclaringType表示定义方法的类(类型)。

GetCustomAttribute用于在方法或类上获取属性标记。

答案 1 :(得分:1)

每个委托都有一个Method属性,使您可以访问MethodInfo实例,其中包含有关委托引用的方法的所有元数据。要访问此媒体资源,您必须将Func<T,TResult>投射到Delegate。然后从MethodInfo轻松获取DeclaringType

Type methodClass = ((Delegate)meth[i]).Method.DeclaringType

现在从methodClass您可以检索属性:

RegexAttribute attr = (RegexAttribute)methodClass.GetCustomAttribute(typeof(RegexAttribute));

注意:如果Parse方法不是静态的,您可以使用Delegate.Target来访问实际的实例。因此,[Regex]属性必须在后代类中声明,它仍然可以工作。