C# 在C中从更高层次结构中获取嵌套类型#

C# 在C中从更高层次结构中获取嵌套类型#,c#,reflection,types,nested,hierarchy,C#,Reflection,Types,Nested,Hierarchy,我有几个名为SortMethod的类,它们继承自名为ASortMethod的抽象类。这些类中的每一个都嵌套在另一个类中。现在,我正在处理一个名为引文集合的类中的SortMethod 我正在处理的另一个类叫做CustomSortDictionary。这必须处理给定的SortMethod类型,但不知道将给出哪个SortMethod类型,因此我将变量type SortMethod存储在CustomSortDictionary中 这意味着我不得不处理很多混乱的反思。在给定的类型sortMethod中,我

我有几个名为
SortMethod
的类,它们继承自名为
ASortMethod
的抽象类。这些类中的每一个都嵌套在另一个类中。现在,我正在处理一个名为
引文集合
的类中的
SortMethod

我正在处理的另一个类叫做
CustomSortDictionary
。这必须处理给定的
SortMethod
类型,但不知道将给出哪个
SortMethod
类型,因此我将变量
type SortMethod
存储在
CustomSortDictionary

这意味着我不得不处理很多混乱的反思。在给定的
类型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
中声明的,这是从
引文集合.SortMethod
向上的一个层次阶梯

如何使用反射正确访问第二项

有关完整代码,请参阅

更新:

我在微软的网站上发现,这可能解释了我的问题:

BindingFlags.FlatterHierarchy
指定应返回层次结构上的公共和受保护静态成员。不会返回继承类中的私有静态成员。静态成员包括字段、方法、事件和属性不会返回嵌套类型。

您的排序方法类型如下所示,对吗

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
    }
}

您可以让一个方法通过实现接口的类进行迭代,以查找并返回正确的方法。

由于类型
CustomSort
始终嵌套在
ASortMethod
中,您可以直接获取它:

((IDCollection)typeof(ASortMethod.CustomSort).GetField("Methods").GetValue(null)).Add(ref name);
如果由于某种原因无法找到,您可以沿着基本类型一直走到
对象
,找到
自定义排序的封闭类型

((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;
}

你能提供一个可调试的例子吗?@他们说的是一个方法?这将需要大量的类来拼写,无论是片段还是否。我想你在某处有这些类,所以你可以去掉所有不需要的部分,只剩下相关的部分。@Thehenny下面是我在调试时观察到的内容:1)引证集合.SortMethod.CustomSort.Methods存在;2) (IDCollection)SortMethod.GetNestedType(“CustomSort”,bindingFlags).GetField(“Methods”).GetValue(null)不支持。如果您需要任何其他详细信息或需要完整的代码,请告诉我。@Thehenny在这里。我不太明白你的意思
SortMethod
看起来不像那样。有关原始代码的较大片段,请参见。我也有点困惑,界面会有什么帮助。我使用抽象类的原因与此类似。另外需要注意的是,
SortMethod
不是
enum
。它是一个密封类,存储
ID
对象的方式类似于
enum
的工作方式,但在适应方法、嵌套类型、其他对象等方面更灵活。是的,看起来您使用抽象类也是出于同样的原因。接口只要求实现它的每个类都有某些成员,这样就不需要嵌套。看起来您可以将代码缩短为一个
Sorter
类。只需添加各种方法来处理不同的排序样式。然后使用它看起来像:
Sorter-Sorter=新的分拣机(数据)
then
YourType sorted=sorter.Sort(someEnumType)。我希望如此!不幸的是,就结构而言,它有点复杂。。。我同意我们出于同样的原因使用它,但我不能避免嵌套,因为除了
引文收集
之外,我还需要
排序方法
类。另外,我正在使用
CustomSortDictionary
来存储这些方法,这样就可以通过编程方式添加它们,而无需实际停止程序并编辑源代码,因为这是不实际的。这使未来更容易。您在Pastebin代码中看到的
id
用于识别方法。然后,
IDCollection
引文收集.SortMethod.CustomSort.methods
用于存储与这些
id
相关的名称,尽管这听起来有点荒谬。我这样做只是为了让人觉得我在处理带有名称的字段,就像使用
SortMethod.Referority
或其同级一样。使用
ASortMethod
的唯一问题是,每个
SortMethod
类型都将有一个不同的
CustomSort.Methods
对象。除非我对从抽象类继承的静态字段有什么误解。。。你能澄清我的误解吗?否则,看起来不错。递归攀爬很聪明。@Jenguinie说实话,在这种情况下我不是绝对肯定,但由于场是静态的,所以总是只有一个场。嗯,我想只有一种方法可以找到。。。我将测试它,看看改变一个的值是否会改变另一个的值。不幸的是,这两个值是一样的。整个结构都有缺陷,然后。。。我很可能要把它变成一个界面。