从委托获取基础类的类型
本文关键字:类型 基础类 获取 | 更新日期: 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
用于获取在方法或类上标记的属性。