3

私は以下のコードを持っています:

List<Type> p1 = new List<Type>();
p1.Add(typeof(int));
p1.Add(typeof(string));
dynamic genericDic = typeof(Dictionary<, >);
dynamic specificDic1 = genericDic.MakeGenericType(p1.ToArray());
dynamic dic1 = Activator.CreateInstance(specificDic1);
dic1.Add(1, "John");
dic1.Add(2, "Smith");
dynamic genericLst = typeof(List<>);
dynamic specificLst = genericLst.MakeGenericType(typeof(string));
dynamic list = Activator.CreateInstance(specificLst);
list.AddRange(dic1.Values.ToList());

実行しようとするとlist.AddRange(dic1.Values.ToList());、次の例外が発生します

タイプ 'ValueCollection' のパブリック メンバー 'ToList' が見つかりません。

スタックトレース:

   at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
   at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
   at StyleResearch.DataManagement.DataStream.Business.MonthEndProcess.ConverToLegacyStructureInMemory(List`1 marketDataTypeIds, String tableName, Int32 placeHolderValue) in C:\Style Research\Work\SRDM\trunk\StyleResearch.DataManagement.DataStream.Business\MonthEndProcess.vb:line 1850
   at StyleResearch.DataManagement.DataStream.UI.DDLMonthEndProcess._Lambda$__6(LegacyStructureDetail legacy) in C:\Style Research\Work\SRDM\trunk\StyleResearch.DataManagement.DataStream.UI\DDLMonthEndProcess.vb:line 1198
   at System.Threading.Tasks.Parallel.<>c__DisplayClass2d`2.<ForEachWorker>b__23(Int32 i)
   at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()

注: VB.NET サンプルを C# に変換しましたが、スタック トレースは VB.NET プロジェクトからのものです。

以下を実行すると、まったく問題なく動作します。

Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "John");
dic.Add(2, "Smith");
List<string> lst = new List<string>();
lst.AddRange(dic.Values.ToList());
4

4 に答える 4

3

キャストするだけです:

list.AddRange(((IEnumerable<string>)dic1.Values).ToList());

また、再び動的に行くことができます:

list.AddRange((dynamic)dic1.Values));
于 2012-07-05T10:43:17.917 に答える
2

ToList<T>() は IEnumerable<T> の拡張メソッドです。しかし、あなたの dic1.Values は IEnumerable<string> ではなく動的な型であるため、.Net はこの拡張メソッドを見つけて使用できません。シンプルなforeachを試すことができます:

foreach (var value in dic1.Values)
  list.Add(value)
于 2012-07-05T10:40:14.437 に答える
0
list.AddRange((IEnumerable<string>)dic.Values))

また

List<string> list = ((IEnumerable<string>)dic.Values).ToList();

また

List<string> list = new List<string>((IEnumerable<string>)dic.Values);
于 2012-07-05T10:44:42.340 に答える
0

拡張関数構文なしで呼び出してみてください。つまり、次のようなものです。

Enumerable.ToList ( (dynamic) dic1.Values )

DLR は、実行時に継承されたインターフェイスの拡張関数を検索しません (パフォーマンス上の理由またはあいまいさを避けるためだと思います)。

于 2012-07-05T11:56:16.197 に答える