C# 泛型递归函数

C# 泛型递归函数,c#,class,generics,recursion,types,C#,Class,Generics,Recursion,Types,我正在尝试编写一个递归函数,该函数将类作为参数,并检查其所有成员,以确保所有成员都是字段类型或嵌套类型。函数应调用自身,以将嵌套类型成员作为参数。这就是我失败的地方: private void Validate<C>() where C : class { MemberInfo[] x = typeof(C).GetMembers(); for (int i = 0; i < x.Length; i++) {

我正在尝试编写一个递归函数,该函数将类作为参数,并检查其所有成员,以确保所有成员都是字段类型或嵌套类型。函数应调用自身,以将嵌套类型成员作为参数。这就是我失败的地方:

    private void Validate<C>() where C : class
    {
        MemberInfo[] x = typeof(C).GetMembers();
        for (int i = 0; i < x.Length; i++)
        {
            if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
            {
                throw new Exception(string.Format("Class members must be of type Field or NestedType"));
            }
//here I have problem sending 'a' as argument to the validate function 
      x.Where(a => a.MemberType == MemberTypes.NestedType).ToList().ForEach(a => Validate<typeof(a)>());
        }
    } 
private void Validate(),其中C:class
{
MemberInfo[]x=typeof(C).GetMembers();
对于(int i=0;ia.MemberType==MemberTypes.NestedType).ToList().ForEach(a=>Validate());
}
} 

您需要使用反射来调用具有正确类型参数的方法:

typeof(YourClass)
    .GetMethod(nameof(Validate))
    .MakeGenericMethod(a.GetType())
    .Validate()
private void Validate<C>() where C : class
{
    Validate(typeof(C));
} 

private void Validate(Type type)
{
    MemberInfo[] x = type.GetMembers();
    for (int i = 0; i < x.Length; i++)
    {
        if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
        {
            throw new Exception(string.Format("Class members must be of type Field or NestedType"));
        }

        foreach (var n in x.GetNestedTypes())
            Validate(n);
    }
}

您需要使用反射来调用具有正确类型参数的方法:

typeof(YourClass)
    .GetMethod(nameof(Validate))
    .MakeGenericMethod(a.GetType())
    .Validate()
private void Validate<C>() where C : class
{
    Validate(typeof(C));
} 

private void Validate(Type type)
{
    MemberInfo[] x = type.GetMembers();
    for (int i = 0; i < x.Length; i++)
    {
        if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
        {
            throw new Exception(string.Format("Class members must be of type Field or NestedType"));
        }

        foreach (var n in x.GetNestedTypes())
            Validate(n);
    }
}

更简单的解决方案是定义一个私有方法重载,该重载接受
类型
参数:

typeof(YourClass)
    .GetMethod(nameof(Validate))
    .MakeGenericMethod(a.GetType())
    .Validate()
private void Validate<C>() where C : class
{
    Validate(typeof(C));
} 

private void Validate(Type type)
{
    MemberInfo[] x = type.GetMembers();
    for (int i = 0; i < x.Length; i++)
    {
        if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
        {
            throw new Exception(string.Format("Class members must be of type Field or NestedType"));
        }

        foreach (var n in x.GetNestedTypes())
            Validate(n);
    }
}
private void Validate(),其中C:class
{
验证(类型(C));
} 
私有void验证(类型)
{
MemberInfo[]x=type.GetMembers();
对于(int i=0;i
更简单的解决方案是定义一个接受
类型的
参数的私有方法重载:

typeof(YourClass)
    .GetMethod(nameof(Validate))
    .MakeGenericMethod(a.GetType())
    .Validate()
private void Validate<C>() where C : class
{
    Validate(typeof(C));
} 

private void Validate(Type type)
{
    MemberInfo[] x = type.GetMembers();
    for (int i = 0; i < x.Length; i++)
    {
        if (x[i].MemberType != MemberTypes.Field && x[i].MemberType != MemberTypes.NestedType)
        {
            throw new Exception(string.Format("Class members must be of type Field or NestedType"));
        }

        foreach (var n in x.GetNestedTypes())
            Validate(n);
    }
}
private void Validate(),其中C:class
{
验证(类型(C));
} 
私有void验证(类型)
{
MemberInfo[]x=type.GetMembers();
对于(int i=0;i
您需要使用反射。@SLaks您能告诉我如何使用吗?次要的无关错误:条件应该包含
&&
,而不是
|
;否则,它将始终满足以下要求:
x[i].MemberType!=MemberTypes.Field&&x[i]。MemberType!=MemberTypes.NestedType
。您需要使用反射。@SLaks您能告诉我如何使用吗?轻微的无关错误:条件应该包含
&&
,而不是
|
;否则,它将始终满足以下要求:
x[i].MemberType!=MemberTypes.Field&&x[i]。MemberType!=MemberTypes.NestedType
。在这种情况下,我应该在我的coe中将
YourClass
替换为什么?这是我的问题,包含您的方法的类。在这种情况下,我应该用什么替换我的coe中的
YourClass
?这是我的问题,这个类包含了你的方法。谢谢。顺便说一下,它应该是
n.GetType()
;)@AshkanMobayenKhiabani:您指出我错误地将
MemberInfo
传递给
Validate
。但是,我不认为调用
MemberInfo.GetType
是正确的,因为它返回
RuntimeType
的类型信息。我建议改为使用,如更新的代码所示。Greaaaaat,非常感谢。顺便说一下,它应该是
n.GetType()
;)@AshkanMobayenKhiabani:您指出我错误地将
MemberInfo
传递给
Validate
。但是,我不认为调用
MemberInfo.GetType
是正确的,因为它返回
RuntimeType
的类型信息。我建议改为使用,如更新的代码所示。