我们如何检查动态粘土对象是否具有属性?

时间:2014-08-05 22:45:46

标签: c# dynamic orchardcms orchardcms-1.8 clay

我有一个动态对象,我认为是用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?

https://twitter.com/bleroy/status/497078654405312512

3 个答案:

答案 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)

@Shaun Luttin,在Orchard cms的背景下是一个相当古老的问题,但最近我提出了这个已经提交的pull request

所以,现在你可以使用以下内容而不抛出异常

<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链接

最佳