首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# -如何将类型作为参数传递

C# -如何将类型作为参数传递
EN

Stack Overflow用户
提问于 2010-12-07 04:49:32
回答 5查看 1.4K关注 0票数 0

我认为问这个问题比回答这个问题更难。我想用一个例子来问我的问题:你知道我们可以把一个对象绑定到一个DataSource上,这个对象可以是任何类型的。因此,假设我已经将"MyClass“类型的对象绑定到DataSet的DataSource。现在我将这个数据集作为参数发送给另一个DLL中的另一个类,在这个DLL文件中,我想创建一个"MyClass“类型的List<>。因为我无法访问"MyClass“类型,所以我可以使用以下代码来获取DataSource的类型:

代码语言:javascript
运行
复制
_dataSet.DataSource.GetType()

但是我不能使用如下代码来创建“MyClass”类型的列表:List<_dataSet.DataSource.GetType()> _list;

在这种情况下我应该怎么做?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-07 04:57:22

基本上有两种选择:

  1. 坚持使用List<object>,或者更好地说,我们最接近已知的_dataSet.DataSource
  2. or祖先类型使用讨厌的反射黑客来动态实例化List<T>

在大多数情况下,我个人倾向于选择(1),因为它是:

  • 更易于使用、
  • 可读、
  • sufficiently类型安全、
  • 在自然代码重用方面具有通用性。

第二种选择已经在其他答案中详细阐述了。

票数 1
EN

Stack Overflow用户

发布于 2010-12-07 04:55:06

代码语言:javascript
运行
复制
var newtype = typeof (List<>).MakeGenericType(_dataSet.DataSource.GetType());
var _list = Activator.CreateInstance(newtype);
票数 0
EN

Stack Overflow用户

发布于 2010-12-07 04:56:10

您可以使用反射动态创建泛型类型:

代码语言:javascript
运行
复制
var listType = typeof(List<>).MakeGenericType(
    new[] { _dataSet.DataSource.GetType() }
);
var ctor = listType.GetConstructor(new Type[] { });
var list = ctor.Invoke(null);

请注意,list将被类型化为object

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4370802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档