我有一些名为SortMethod
的类,它继承自名为ASortMethod
的抽象类。这些类中的每一个都嵌套在另一个类中。现在,我正在处理名为SortMethod
的类中的CitationCollection
。
我正在处理另一个名为CustomSortDictionary
的课程。这必须处理给定的SortMethod
类型,但不知道将给出SortMethod
类型,因此我将变量Type sortMethod
存储在CustomSortDictionary
中。
这意味着我不得不处理大量凌乱的反思。在给定的Type sortMethod
中,有两件我想要访问的主要内容。第一个我能够使用下面的代码访问,但第二个我无法访问。
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy;
// Accessing the first
MethodInfo m = SortMethod.GetMethod("ConstructCustomSortMethods", bindingFlags);
m.Invoke(null, null);
// Accessing the second
IDCollection customSort = (IDCollection)SortMethod.GetNestedType("CustomSort", bindingFlags).GetField("Methods").GetValue(null);
我尝试了BindingFlags
的几个不同组合,试图在第二段代码中找到嵌套类型,但我无法访问它。我认为问题是SortMethod.CustomSort.Methods
是在ASortMethod
内声明的,这是CitationCollection.SortMethod
的分层阶梯的一步。
如何使用反射正确访问第二项?
有关完整代码,请参阅this link。
更新
我在微软的网站上找到了this,这可以解释我的问题:
BindingFlags.FlattenHierarchy
指定应返回层次结构中的公共和受保护静态成员。不返回继承类中的私有静态成员。静态成员包括字段,方法,事件和属性。 不会返回嵌套类型。
答案 0 :(得分:0)
您的排序方法类型看起来是这样的吗?
public enum SortType { Ascend, Descend, FlyingTriangle }
您可能希望使用接口,以便实现它的所有方法都需要接受或拒绝请求的排序。
示例强>
public interface ISortable
{
public bool IsValidContext(object record, SortType type);
}
public class SortAlpha : ISortable
{
public bool IsValidContext(object record, SortType type)
{
return type == SortType.Ascend ? true : false; // example
}
}
public class SortBeta : ISortable
{
public bool IsValidContext(object record, SortType type)
{
return type == SortType.Descend && record is HtmlDocument; // example
}
}
您可以让方法通过实现接口的类进行迭代,以查找并返回正确的接口。
答案 1 :(得分:0)
由于CustomSort
类型始终嵌套在ASortMethod
中,您可以直接获取它:
((IDCollection)typeof(ASortMethod.CustomSort).GetField("Methods").GetValue(null)).Add(ref name);
如果由于某种原因你不能走基本类型,直到你到达object
找到封闭类型的CustomSort
((IDCollection)FindBase(SortMethod).GetNestedType("CustomSort", bindingFlags).GetField("Methods").GetValue(null)).Add(ref name);
static Type FindBase(Type t)
{
if (t.BaseType != typeof (object))
return FindBase(t.BaseType);
return t;
}