我的情况很简单。在我的代码中,我有这样的代码:
dynamic myVariable = GetDataThatLooksVerySimilarButNotTheSame();
//How to do this?
if (myVariable.MyProperty.Exists)
//Do stuff
因此,基本上我的问题是如何检查(不抛出异常)某个属性在我的动态变量上是可用的。我可以使用GetType(),但我宁愿避免这样做,因为我并不真正需要知道对象的类型。我真正想知道的是是否有一个属性(或方法,如果这使工作更简单的话)可用。指针吗?
Denis的回答让我想到了另一个使用JsonObjects的解决方案,
头属性检查器:
Predicate<object> hasHeader = jsonObject =>
((JObject)jsonObject).OfType<JProperty>()
.Any(prop => prop.Name == "header");
或许更好:
Predicate<object> hasHeader = jsonObject =>
((JObject)jsonObject).Property("header") != null;
例如:
dynamic json = JsonConvert.DeserializeObject(data);
string header = hasHeader(json) ? json.header : null;
如果你控制的类型被用作动态,你不能返回一个元组而不是每个属性访问的值吗?之类的……
public class DynamicValue<T>
{
internal DynamicValue(T value, bool exists)
{
Value = value;
Exists = exists;
}
T Value { get; private set; }
bool Exists { get; private set; }
}
可能是一个幼稚的实现,但如果您每次都在内部构造其中一个,并返回该值而不是实际值,那么您可以在每个属性访问上检查Exists,如果值为默认值(T),则单击value(如果不为默认值,则不相关)。
也就是说,我可能会遗漏一些动态工作原理的知识,这可能不是一个可行的建议。
Denis的回答让我想到了另一个使用JsonObjects的解决方案,
头属性检查器:
Predicate<object> hasHeader = jsonObject =>
((JObject)jsonObject).OfType<JProperty>()
.Any(prop => prop.Name == "header");
或许更好:
Predicate<object> hasHeader = jsonObject =>
((JObject)jsonObject).Property("header") != null;
例如:
dynamic json = JsonConvert.DeserializeObject(data);
string header = hasHeader(json) ? json.header : null;