从委托获取基础类的类型

本文关键字:类型 基础类 获取 | 更新日期: 2023-09-27 17:56:17

我有一些类继承了相同的接口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);

从委托获取基础类的类型

每个委托都有一个 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] 属性,并且它仍然有效。

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

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用于获取在方法或类上标记的属性。