LinePragmas を CodeDom オブジェクトに追加したい状況があります。ただし、一部のコード DOM オブジェクトには LinePragma プロパティがあり、一部にはありません。
したがって、 dynamic キーワードを使用して、プロパティがオブジェクトに存在するかどうかを (例外をスローせずに) 検出し、存在する場合はプラグマを追加できるかどうか疑問に思っています。これが私の現在の方法です:
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);
}