我有一个情况,需要将LinePragmas添加到CodeDom对象中。但是有些代码dom对象具有LinePragma属性,而有些则没有。
所以我想知道是否可以使用动态关键字来检测对象上是否存在该属性(不会抛出异常),如果存在,则添加pragma。以下是我的当前方法:
public static T SetSource<T>(this T codeObject, INode sourceNode)
where T : CodeObject
{
codeObject.UserData["Node"] = sourceNode.Source;
dynamic dynamicCodeObject = codeObject;
// How can I not throw an exception here?
if (dynamicCodeObject.LinePragma != null)
{
dynamicCodeObject.LinePragma = new CodeLinePragma(
sourceNode.Source.Path.AbsoluteUri,
sourceNode.Source.StartLine);
}
return codeObject;
}
更新: 我采用的解决方案是添加了一个名为Exists()的扩展方法。我在这里写了一篇博客文章: Member Exists Dynamic C# 4.0
要点是创建一个返回实现DynamicObject的TryGetMember的对象的扩展方法。它使用反射来返回true或false。这使您可以编写以下代码:
object instance = new { Foo = "Hello World!" };
if (instance.Reflection().Exists().Foo)
{
string value = instance.Reflection().Call().Foo;
Console.WriteLine(value);
}