gpt4 book ai didi

C# - 快速观察中的内部属性 "readable"但不使用反射?

转载 作者:太空狗 更新时间:2023-10-30 00:11:48 26 4
gpt4 key购买 nike

我看到“快速观察”窗口可以访问所有属性,无论库中类的访问限制(内部、 protected 、私有(private))如何,即使在完全不同的应用程序、lib 和命名空间。而我没有找到使用“反射”访问这些的方法。我特别想“阅读”(注意 - 只是阅读)程序集的内部属性。如果通过“内部”工作方式的设计(在同一命名空间之外无法访问)这是不可能的,那么它为什么会被 VS.NET 中的“快速观察”窗口“读取”?

这是我使用的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLib
{
public class TestInteralProp
{
internal string PropertyInternal
{
get { return "Internal Property!"; }
}

protected string PropertyProtected
{
get { return "Protected Property!"; }
}

string PropertyPrivate
{
get { return "Private Property!"; }
}

public string PropertyPublic
{
get { return "Public Property!"; }
}

protected internal string PropertyProtectedInternal
{
get { return "Protected Internal Property!"; }
}
}
}

当我为 TestInernalProp 类创建一个对象时,我可以在 quickwatch 中看到所有 4 个属性 -

props

当我使用反射访问除公共(public)属性 (PropertyPublic) 之外的任何这些时,我得到一个空引用异常。

//this works
propTestObj.GetType().InvokeMember("PropertyPublic", System.Reflection.BindingFlags.GetProperty, null, propTestObj, null);
//this fails (obviously)
propTestObj.GetType().InvokeMember("PropertyInternal", System.Reflection.BindingFlags.GetProperty, null, propTestObj, null);

//this works
propTestObj.GetType().GetProperty("PropertyPublic").GetValue(propTestObj, null);
//this fails again
propTestObj.GetType().GetProperty("PropertyInternal").GetValue(propTestObj, null)

我不清楚“快看”如何获取这些内容。

最佳答案

使用这些标志

BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance

此操作不需要 GetProperty 标志。您可能还想添加 Static

注意:您可以将标志与 | 结合使用,因为它们的整数值是 2 的幂。参见 this SO answer .


注意(回应Lalman和shanks对Reflection安全问题的关注)

总是有办法编写糟糕或危险的代码。做与不做由你决定。反射不是常规的做事方式,而是用于对特殊工具(如 o/r-mapper 或分析工具)进行编程。反射非常强大;但是,您应该明智地使用它。

关于C# - 快速观察中的内部属性 "readable"但不使用反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9667654/

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