我有一个动态对象,我认为是用Clay实现的。它有两个可能的属性名称之一。我想使用哪个属性名称可用。以下不起作用:
dynamic workItemPart = item.WorkItem; // is an Orchard.ContentManagement.ContentPart
var learnMore = workItemPart.LearnMore ?? workItemPart.LearnMoreField;
抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
:
不包含“LearnMore”
的定义
我们如何检查动态Clay对象是否具有属性? In JavaScript, for instance, we can do the following.
var workItemPart = {
LearnMoreField: "Sure"
}
console.log(workItemPart.LearnMore || workItemPart.LearnMoreField);
C#与Clay有什么相同的简洁吗?
相关:
Is Orchard.ContentManagement.ContentPart implemented with Clay?
答案 0 :(得分:2)
您还可以使用索引方法:
var learnMore = workItemPart["LearnMore"] != null ?
workItemPart.LearnMore : workItemPart.LearnMoreField;
希望这有帮助。
<强>更新强>
我不确定为什么不这样做。两种方法都应该有效。
dynamic New = new ClayFactory();
var person = New.Person();
person.skill = "Outstanding";
var talent = person.talent;
var talentTwo = person["talent"];
var skill = person.talent ?? person.skill;
Console.WriteLine(skill);
skill = person.skill ?? person.talent;
Console.WriteLine(skill);
也许正是Orchard给你扔了一个曲线球......
有趣的是,null-coalesce运算符不能正确处理第一个测试用例。但是,标准测试成功了:
skill = person.talent != null ? person.talent : person.skill;
Console.WriteLine(skill);
目前还不确定要告诉你什么。
答案 1 :(得分:1)
您可以使用扩展方法检查属性是否存在:
public static class Extensions
{
public static bool HasProperty(this object d, string propertyName)
{
return d.GetType().GetProperty(propertyName) != null;
}
}
用法:
bool hasProperty = Extensions.HasProperty(workItemPart, "LearnMore");
var learnMore = hasProperty ? workItemPart.LearnMore : workItemPart.LearnMoreField;
它看起来不像是一个扩展方法..因为workItemPart
是动态的,你需要通过指定类名来显式调用它。
答案 2 :(得分:1)
所以,现在你可以使用以下内容而不抛出异常
<meta http-equiv="refresh" content="0; url=yourfile.pdf">
ContentItem和ContentPart类继承自System.Dynamic.DynamicObject并覆盖TryGetMember()方法。并且,之前,如果没有找到属性,则该方法返回false
if (contentItem.SomePart != null)
if (part.SomeField != null)
现在,即使结果对象(方法的out参数)设置为null,该方法返回true,以防止抛出异常
return false;
有关详细信息,请参阅上面的相关PR链接
最佳