問題
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
、すべてがどのタイプでも正常に機能します。
私の質問は、タイプの場合にメソッドが見つからない理由です。Add
DisposableLazy
バックグラウンド
このコードは、メソッドで使用するメソッドの一部ですOnImportsSatisfied()
。私は2種類のインポートを使用RequiredCreationPolicy
していCreationPolicy.NonShared
ますCreationPolicy.Any
.
[ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
private IEnumerable<Lazy<IPlugin, IMetadata>> plugins = null;
CreationPolicy.NonShared
フィールドの場合は下にあるタイプがplugins
isDisposableLazy
でCreationPolicy.Any
、下にあるタイプはplugins
isにありLazy
ます。
編集:回答で尋ねられたように、このメソッドが呼び出されるたびにインターフェイスが変更される可能性があり、共通のものを持つ必要がないdynamic
ため、変数を使用しています。IPlugin
Edit2:同様の質問C# dynamic type gotchaを見つけたので、これはおそらく重複として閉じられる可能性があります。