2

オブジェクトは、IDynamicMetaObject Provider を実装するか、このインターフェイスの既定の実装を提供する DynamicObject をサブクラス化することで、より簡単にバインディング セマンティクスを提供できます。

ソース

私はこのインターフェイスもクラスも実装したことがなく、常に動的に実行できました。

public class aa
    {
        public void bbb()
        {  }
    }

dynamic a = new aa().bbb();

では、この引用はどういう意味ですか?

IDynamicMetaObject または DynamicObject 継承をいつ使用する必要があるかを理解しようとしています

4

2 に答える 2

2

このdynamicキーワードにより、オブジェクトへの参照が遅延バインドされ、実行時にのみ解決されます。IDynamicMetaObjectProvider通常、これは実行時のプロパティ解決の処理方法をコードで決定できる実装者を使用しているためです。つまり、実行時にプロパティを追加および削除することができます (通常は のような辞書として実装されますExpandoObject)。

あなたのコード例が行っていることは、コンパイル型の型チェックを妨げているだけです。実際、クラスの存在しないプロパティまたはメソッドにアクセスするコードを記述した場合、コードはコンパイルされますが、もちろん実行時にクラッシュするため、何もしないよりも悪いことです。具体的なクラスを参照する正当な理由はあまり思いつきませんdynamic(スクイーズな型キャストやダックタイピングを期待しますが、C# では通常、このようなものにインターフェイスを使用します!)

DynamicObject私自身のプロジェクトの 1 つから継承する動的オブジェクトの実装例:

https://github.com/jamietre/IQObjectMapper/blob/master/source/IQObjectMapper/IQDynamicObject.cs

(オプションを含む新しい辞書を返すファクトリ メソッドを 1 回呼び出します。これを非依存にするために必要なことは、コンストラクターを次のように変更することだけです。

InnerDict = ObjectMapper.MapperCache.GetDictionary<object>(Options);

に:

InnerDict = new Dictionary<string,object>();

オプションをチェックするいくつかの条件を取り除きます

于 2012-05-05T20:32:59.583 に答える
0

あまり参考にならないので、このような「つまらない」回答をするのは嫌いですが、これは実際には「必要な場合は知っている」というケースです。

アプリケーションやほとんどのライブラリ コードで動的オブジェクトを実装する必要があることは非常にまれです。このインターフェースは、動的オブジェクトとしてのみ使用できるクラスを実装する人々を対象としています。たとえば、オブジェクトに Javascript のような動作を実装したい場合などです。そのようなオブジェクトで必要な任意のプロパティまたはメソッドを呼び出すことができ、コンパイルされます。特定の呼び出しが機能するかどうかを判断するのは、実行時の実装次第です。

まったく無意味ですが、説明的な例は、曜日に基づいて有効なプロパティを決定するクラスです。

public class WeekendObject : DynamicObject
{
  Dictionary<string, object> propertybag = new Dictionary<string, object>();      

  public override bool TryGetMember(GetMemberBinder binder, out object result)
  {
    if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
    {
      if (name.StartsWith("Sunday"))
      {
        return propertybag.TryGetValue(name, out result);
      }
    }
    else
    {
      if (!name.StartsWith("Sunday"))
      {
        return propertybag.TryGetValue(name, out result);
      }
    }
  }

  public override bool TrySetMember(SetMemberBinder binder, object value)
  {
    if (DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
    {
      if (name.StartsWith("Sunday"))
      {
        propertybag[binder.Name.ToLower()] = value;
        return true;
      }
    }
    else
    {
      if (!name.StartsWith("Sunday"))
      {
        propertybag[binder.Name.ToLower()] = value;
        return true;
      }
    }

    return false;
  }
}
于 2012-05-05T20:58:10.863 に答える