我有一个动态对象,我认为是用 Clay 实现的。它具有两个可能的属性名称之一。我想使用任何可用的属性名称。以下不起作用:
dynamic workItemPart = item.WorkItem; // is an Orchard.ContentManagement.ContentPart
var learnMore = workItemPart.LearnMore ?? workItemPart.LearnMoreField;
它抛出一个Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
:
不包含“了解更多”的定义
我们如何检查动态 Clay 对象是否具有属性? 例如,在 JavaScript 中,我们可以执行以下操作。 http://repl.it/WUJ
var workItemPart = {
LearnMoreField: "Sure"
}
console.log(workItemPart.LearnMore || workItemPart.LearnMoreField);
C# 和 Clay 中还有这么简洁的东西吗?
Related:
Orchard.ContentManagement.ContentPart 是用 Clay 实现的吗? https://stackoverflow.com/questions/25166799/is-orchard-contentmanagement-contentpart-implemented-with-clay
https://twitter.com/bleroy/status/497078654405312512 https://twitter.com/bleroy/status/497078654405312512
您还可以使用索引方法:
var learnMore = workItemPart["LearnMore"] != null ?
workItemPart.LearnMore : workItemPart.LearnMoreField;
希望这可以帮助。
UPDATE
我不知道为什么没有。两种方法都应该有效。
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 给你扔了一个曲线球......
有趣的是,空合并运算符没有正确处理第一个测试用例。但是,标准测试成功:
skill = person.talent != null ? person.talent : person.skill;
Console.WriteLine(skill);
目前不知道该给您什么建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)