7

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);
}
4

6 に答える 6

3

18か月後...リリースされた今、あなたが本当に望んでいたものがそこにあるようです. それはTryGetMemberTryGetValueなどです...実際には、おそらくTrySetMemberです。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject_members.aspx

于 2010-09-07T02:07:33.907 に答える
-1

考えてみてください。ターゲットクラスは、存在しないメンバーのメンバールックアップと呼び出しに独自の実装を提供できるため(IDynamicObjectを実装するか、DynamicObjectをサブクラス化することにより)、メンバーが存在するかどうかを確認する唯一の方法は、メンバーを呼び出して、オブジェクトかどうかを確認することです。それを処理するか、例外をスローします

繰り返しになりますが、存在しないメンバーの処理は動的です!

- 編集 -

オブジェクトの作成を制御する場合は、クラスをサブクラス化し、IDynamicObjectを実装して、メソッドが存在しないことを他のクラスに通知できます。

真実を指摘している場合、答えを否定するのは不公平です。つまり、メンバーを呼び出す以外に、動的ディスパッチ環境でメンバーの存在を確認する信頼できる方法はなく、信頼できる方法はありません。

于 2009-07-01T23:06:11.970 に答える
-1

チャイムを鳴らして、静的型付けでこの問題を回避できると言います。

これは、オーバーライドを使用した抽象メソッドの候補です。

于 2009-07-01T22:49:49.523 に答える