Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ICollection上执行.Add()方法_C#_.net - Fatal编程技术网

C# 在ICollection上执行.Add()方法

C# 在ICollection上执行.Add()方法,c#,.net,C#,.net,我有一个我知道实现ICollection的某种类型的对象。在编译时,我不知道泛型集合的类型是什么——它几乎可以是任何类型 我有一个T类型的新对象,但在编译时我仍然不知道该类型是什么 我想这样做: object myCollection; // I know it implements ICollection<T>, but nothing more object newObject; // I know that newObject.GetType() matches T, but

我有一个我知道实现ICollection的某种类型的对象。在编译时,我不知道泛型集合的类型是什么——它几乎可以是任何类型

我有一个T类型的新对象,但在编译时我仍然不知道该类型是什么

我想这样做:

object myCollection; // I know it implements ICollection<T>, but nothing more
object newObject; // I know that newObject.GetType() matches T, but nothing more

myCollection.Add( newObject ); // This syntax is clearly ludicrous, but...
如何使最后一行在不使用反射的情况下工作?现在,我正在反映从中构造的类型的MethodInfo

object myCollection;
object newObject;

var typ = newObject.GetType();
var colTyp = typeof( ICollection<> ).MakeGenericType( new Type[] { typ } );
var mi = colTyp.GetMethodInfo( "Add" );
mi.Invoke( myCollection, new object[] { newObject } );
这看起来像是一场性能噩梦,即使我基于newObject.GetType做了一些缓存

有更好的办法吗


编辑:不使用动态对象

是否可以使集合实现非通用ICollection?如何检索该集合?也许有一种更好的方法让它返回你想要的,而不是让消费者尝试花哨的技巧。C是静态类型的。你期待什么?如果您有一个编译时类型声明为对象类型,那么您可以选择反射或动态,这两种技术您已经提到过了。使用反射检索对集合的引用。返回类型中的所有集合成员。我希望能够根据传递到对象级别的object.GetType将包含collections方法的对象添加到正确的集合中。此外,ICollection是必要的,因为类需要模拟使用ICollection的不同类。我不认为您可以通过静态类型的泛型方法或其他方法检索对集合的引用?