1

問題

Addメソッドがdynamic変数で呼び出されたときに、動的に作成されたアイテムのリストを使用して問題に直面しています。次のコードを検討してください。

IEnumerable<dynamic> plugins = (IEnumerable<dynamic>)field.GetValue(instance);
if (plugins == null)
  continue;

dynamic filteredPlugins = null;
foreach (var plugin in plugins)
{
  if (filteredPlugins == null)
  filteredPlugins = Activator
    .CreateInstance(typeof(List<>)
    .MakeGenericType(plugin.GetType()));

if (/* this condition does not matter*/)
  //filteredPlugins.Add(plugin);
  filteredPlugins.GetType().GetMethod("Add")
    .Invoke(filteredPlugins, new object[] { plugin });
}

そして今、コメント行は、タイプの場合にメッセージとともにfilteredPlugins.Add(plugin)スローされますSystem.Reflection.TargetInvocationException'object' does not contain a definition for 'Add'plugin

System.ComponentModel.Composition.ExportServices.DisposableLazy<IPlugin,IMetadata>

pluginしかし、タイプの場合は完全に完璧に機能します

System.Lazy<IPlugin, IMetadata>

次の行で行われているように、リフレクションを使用しAddてインスタンス インスタンスのメソッドを呼び出すとfilteredPlugins、すべてがどのタイプでも正常に機能します。

私の質問は、タイプの場合にメソッドが見つからない理由です。AddDisposableLazy

バックグラウンド

このコードは、メソッドで使用するメソッドの一部ですOnImportsSatisfied()。私は2種類のインポートを使用RequiredCreationPolicyしていCreationPolicy.NonSharedますCreationPolicy.Any.

[ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
private IEnumerable<Lazy<IPlugin, IMetadata>> plugins = null;

CreationPolicy.NonSharedフィールドの場合は下にあるタイプがpluginsisDisposableLazyCreationPolicy.Any、下にあるタイプはpluginsisにありLazyます。

編集:回答で尋ねられたように、このメソッドが呼び出されるたびにインターフェイスが変更される可能性があり、共通のものを持つ必要がないdynamicため、変数を使用しています。IPlugin

Edit2:同様の質問C# dynamic type gotchaを見つけたので、これはおそらく重複として閉じられる可能性があります。

4

1 に答える 1