在javascript中,您可以使用undefined关键字检测属性是否已定义:
if( typeof data.myProperty == "undefined" ) ...
Run Code Online (Sandbox Code Playgroud)
你如何在C#中使用带有ExpandoObject和不带异常的动态关键字来做到这一点?
我想在C#中使用动态对象进行简单的鸭子打字示例.在我看来,动态对象应该具有HasValue/HasProperty/HasMethod方法,其中包含一个字符串参数,用于在尝试对其运行之前查找的值,属性或方法的名称.我试图避免尝试/捕获块,如果可能的话,更深入的反射.在动态语言(JS,Ruby,Python等)中进行鸭子输入似乎是一种常见的做法,即在尝试使用它之前测试属性/方法,然后回退到默认值或抛出受控异常.下面的例子基本上就是我想要完成的.
如果上述方法不存在,是否有人有动态的预制扩展方法来执行此操作?
示例:在JavaScript中,我可以非常轻松地测试对象上的方法.
//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}Run Code Online (Sandbox Code Playgroud)
我如何在C#中做同样的事情?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?
//if it doesn't quack, return null
}Run Code Online (Sandbox Code Playgroud) 我正在寻找一个字段的动态对象上的一个属性循环,除了我无法弄清楚如何在不抛出异常的情况下安全地评估它是否存在.
foreach (dynamic item in routes_list["mychoices"])
{
// these fields may or may not exist
int strProductId = item["selectedProductId"];
string strProductId = item["selectedProductCode"];
}
Run Code Online (Sandbox Code Playgroud) 我有一个动态对象,如下所示:
this.ChartDetails.Chart
Run Code Online (Sandbox Code Playgroud)
'图表'是动态的.我想查看名为LeftYAxis的图表上是否存在动态属性.在动态对象上执行此操作的最佳方法是什么?
我不认为这是如何检测ExpandoObject上是否存在属性的重复?因为它没有讨论为动态对象执行此操作的最佳方法.
显然,无论GetADynamicThing()返回的对象类型如何,以下内容在c#4.0中都有效
dynamic d = GetADynamicThing();
d.Foo();
Run Code Online (Sandbox Code Playgroud)
如果d的运行时类型不包含方法Foo(),则抛出RunTimeBinderException.
是否有一种简单的方法可以确定D上是否存在Foo()?
否则,我们会坚持做旧学校对象的反思,或依靠try-catch.不确定我喜欢哪种方法.
更新:所以我们目前有3个选项:
3号似乎是动态的目标用法,在COM情况下很好.我之所以问这个问题的原因是为了回应做这样的事情,即使用一些任意创建的对象的方法.这似乎是使用动态的错误情况.
我在C#中有此代码
foreach (var entry in auditableTableEntries)
{
IAuditableTable table = (IAuditableTable)entry.Entity;
table.ModifiedBy = userId;
table.ModifiedDate = dateTime;
if (entry.State == EntityState.Added || entry.State == EntityState.Modified)
{
if (table.CreatedBy == null || table.CreatedBy == null)
{
table.CreatedBy = userId;
table.CreatedDate = dateTime;
}
}
}
Run Code Online (Sandbox Code Playgroud)
一些表对象具有属性modified,为此,我想将属性设置为秒数。自1970年以来。类似:
table.modified = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds
Run Code Online (Sandbox Code Playgroud)
但是,如何判断该表是否具有该属性?如果属性不存在,我不想设置该属性,因为我认为这会导致异常。
到目前为止,这是我尝试过的:
if (table.GetType().GetProperty("modified") != null)
{
// The following line will not work as it will report that
// an IAuditableTable does not have …Run Code Online (Sandbox Code Playgroud)