gpt4 book ai didi

c# - 拦截动态调用以避免 RuntimeBinderException

转载 作者:行者123 更新时间:2023-11-30 20:38:42 24 4
gpt4 key购买 nike

我想拦截对动态类型的调用,以避免在调用的方法或属性不存在时出现 RuntimeBinderException。例如:

class Foo {
bool IsFool{ get; set; }
}
...
dynamic d = new Foo();
bool isFool = d.IsFoo; //works fine
bool isSpecial = d.IsSpecial; //RuntimeBinderException

我想要做的是在调用时创建不存在的属性或仅返回 null。

编辑:我想做的项目是配置文件读取器。因此,我希望避免执行 try catch 或检查配置文件的每个属性是否存在。

最佳答案

除了在 try .. catch block 中进行处理之外,我没有看到任何特殊的方法

try 
{
bool isSpecial = d.IsSpecial;
return isSpecial;
}
catch(RuntimeBinderException)
{
// do something else
return false;
}

(或)使用System.Reflection命名空间

        bool isSpecial = typeof(Foo)
.GetProperties()
.Select(p => p.Name == "IsSpecial").Count() > 0
? d.IsSpecial : false;

根据您在帖子中的编辑;不确定这有多优雅,但您可以在 App.ConfigWeb.Config 文件中定义 AppSetting 元素,例如

<configuration>
<appSettings>
<add key="IsFool" value="Foo"/>
<add key="Display" value="Foo"/>
</appSettings>
</configuration>

然后可以读取该内容来验证该成员是否存在,然后进行相应的调用

        dynamic d = new Foo();

bool isSpecial = System.Configuration.ConfigurationManager.AppSettings
.AllKeys.Contains("IsSpecial")
? d.IsSpecial : false;

关于c# - 拦截动态调用以避免 RuntimeBinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34901022/

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