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
的类型信息。我建议改为使用,如更新的代码所示。