c# - 如果动态对象不包含属性,则获取默认值

标签 c# .net dynamic

在使用多种语言处理动态对象时,有一种构造允许您获取属性的值,如果该属性不存在,则返回默认值。

我想知道在 .NET 中使用动态时是否有类似的方法/语法。我知道您可以将 ExpandoObject 转换为 Dictionary,但有时无法保证动态对象是 Expando。

我正在考虑与以下代码具有相同效果的东西

public class SomeClass
{
    public string ValidProperty { get; set; }
}

dynamic t = new SomeClass() { 
    ValidProperty = "someValue"
};

Console.WriteLine(t.Get("ValidProperty", "doesn't exist")); // Prints 'someValue'
Console.WriteLine(t.Get("InvalidProperty", "doesn't exist")); // Prints 'doesn't exist'

最佳答案

I want to know if there is a similar method/syntax when working with dynamic in .NET. I know that you can cast an ExpandoObject to a Dictionary, but sometimes there is no guarantee that a dynamic object is an Expando.

而且也不能保证它是一个编译时对象。

您可以使用 try/catch 但这甚至没有说明该属性的存在。动态对象的例子:

 public class MyDynamic: DynamicObject
{
    static int Count = 0;
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = Count++;
        if (binder.Name == "Test")
        {
            return Count % 2 == 0;
        }
        return false;
    }
}

假设你将它用作

dynamic d = new MyDynamic();
try { Console.WriteLine(d.Test); } catch (Exception ex) { Console.WriteLine(ex.Message); }
try { Console.WriteLine(d.Test); } catch (Exception ex) { Console.WriteLine(ex.Message); }
try { Console.WriteLine(d.Test); } catch (Exception ex) { Console.WriteLine(ex.Message); }
try { Console.WriteLine(d.Test); } catch (Exception ex) { Console.WriteLine(ex.Message); }

有些调用 d.Test 会返回一个值,有些会抛出异常。所以我会说,没有安全的方法来测试它,并且没有任何可能不存在的方法的默认值。

关于c# - 如果动态对象不包含属性,则获取默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32769194/

相关文章:

C# HttpWebRequest SEC_I_RENEGOTIATE 间歇性错误

c# - ServiceStack 验证不显示消息

c# - 在 C# 中获取/设置更简单的方法?

.net - 64 位 MSBuild 的优势?

c++ - 最小化距离总和 : Optimization Problem

c# - 使用 MSTSCLib 登录远程桌面

c# - 在 WPF LineSeries DataPoint 上添加事件

java - 将动态变量发送为 ftl 格式

java - post查询的动态过滤条件

c# - 纯 C# 编码的交易