【发布时间】:2015-09-25 06:10:22
【问题描述】:
在使用多种语言的动态对象时,有一个构造允许您获取属性的值,如果该属性不存在,则返回默认值。
我想知道在 .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'
【问题讨论】:
-
可能必须使用反射来解决这个问题?
-
@Jeremy,例如,如果类型是 ExpandoObject 将不起作用(因为 Expando 没有属性,它只是一个字典)。此外,尝试将动态传递给扩展方法会导致 RuntimeException
-
嗯,不,这不是 C# 团队的想法。使用这样的匿名类型最终会让您后悔,它的成员具有 internal 可访问性。换句话说,它不会跨越程序集边界。
-
匿名类型只是为了写一个快速而肮脏的例子。我正在使用的课程是完全公开的课程。对此感到抱歉。