我有一些继承相同接口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);
答案 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]
属性必须在后代类中声明,它仍然可以工作。