gpt4 book ai didi

c# - 在不创建新实例的情况下反射(reflect)嵌套实例

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:13 27 4
gpt4 key购买 nike

我一直在努力处理一些我认为很简单的反射代码。本质上,我有一个定义方法的接口(interface)。然后,我有一个抽象类,它提供该方法的基本实现。

具体类可以包含其他类的嵌套实例,这些实例也可以从同一基类派生。可以用下面的例子来说明:

using System.Linq;

public interface ISampleObject
{
bool IsValid();
}

public abstract class SampleObjectBase : ISampleObject
{
public bool IsValid()
{
var returnValue = true;

// Self-validation sets the return value.

var childProperties = this.GetType().GetProperties().Where(pi => typeof(ISampleObject).IsAssignableFrom(pi.PropertyType));

foreach (var childProperty in childProperties)
{
// var childInstance = ????; // Need the actual *existing* instance property, cast to ISampleObject.
// if (childInstance.IsValid() != true)
// {
// returnValue = false;
// }
}

return returnValue;
}
}

public sealed class InnerSampleObject : SampleObjectBase
{
}

public sealed class OuterSampleObject : SampleObjectBase
{
public InnerSampleObject DerivedSampleObject { get; set; }
}

我的问题是在 SampleObjectBase 的注释代码中,我无法获得匹配的 PropertyInfo 值的具体实例。如果我查看循环中的 PropertyInfo 对象,我发现类型是正确的,但我找不到直接访问实现中已经存在的实例的方法。因此,例如,在执行 OuterSampleObject.IsValid() 时,代码会按预期找到 InnerSampleObject 的 PropertyInfo。我想执行 InnerSampleObject.IsValid()。

我试过(多种变体):

var childIsValid = (bool)contractProperty.PropertyType.InvokeMember("IsValid", BindingFlags.InvokeMethod, null, null, null);

和:

var childInstance = (ISampleContract)contractProperty;

第一个问题是我无法将 null 作为 InvokeMember 的目标传入,因为 IsValid() 不是静态的(也不可能,因为我专注于实际实例)。第二个只是一个蹩脚的类型转换,但却是我想要完成的事情的要点。

上面的示例代码只是我想要实现的一个极简示例。完整代码是自验证 DTO 的一部分,它递归地检查整个层次结构并返回哪些子项存在验证问题以及它们是什么。

如有任何帮助,我们将不胜感激。

最佳答案

怎么样:

var instance = childProperty.GetValue(this, null) as ISampleObject;
if (instance != null)
{
if (!instance.IsValid())
return false;
}

关于c# - 在不创建新实例的情况下反射(reflect)嵌套实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com