c# - 动态类型传递和实例化——如何?

标签 c# dynamic

编辑:更改了Activator,仍然不起作用。

所以我对 C# 非常(非常)陌生,我很确定这是一个骗局,但我已经浏览了前面的问题,但我仍然无法弄清楚所有要点。

我试图通过用通用列表上的映射替换一些重复的代码来减少代码味道。具体来说,我的代码看起来像

var fooNode = node as IFoo;
var barNode = node as IBar;
var bazNode = node as IBaz;
...

if(fooNode != null)
    return new FooThing();
if(barNode != null)
    return new BarThing();
if(bazNode != null)
    return new BazThing();
...

我想概括它。


这是我的尝试:

var types = new Dictionary<Type, Type>
{
    {typeof(IFoo), typeof(FooThing)},
    {typeof(IBar), typeof(BarThing)},
    ...
}

foreach(var entry in types)
{
    var castNode = node as entry.Key;
    return Activator.CreateInstance(entry.Value);
}

当然,它不起作用:找不到类型或命名空间名称“entry”(是否缺少 using 指令或程序集引用?)。你能帮我吗?这种事情在 C# 中可能实现吗?

最佳答案

这个怎么样?

foreach(var entry in types)
{
    if (node != null && entry.Key.IsAssignableFrom(node.GetType()))
    {
        return Activator.CreateInstance(entry.Value);
    }
}

问题在于您将泛型类型参数与运行时类型混淆,特别是 Type类。

如果您知道编译时的类型是什么,那么您可以使用泛型 Activator.CreateInstance<T>()方法来创建底层对象的实例 - 您可以使用类型参数之类的东西,这样这行代码就不需要知道类型是什么,例如:

T CreateObject<T>()
{
    return Activator.CreateInstance<T>();
}

然而这只是推卸责任。为了调用此方法,类型参数的值 T必须在某处提供 - 无论哪种方式,编译器都必须能够解析 T类型(而不是变量或方法)。

相反,Type类在运行时对类型信息进行编码,例如其名称或声明类型的程序集。Activator.CreateInstance还带有一个重载,允许您提供 Type 的实例:

object CreateObject(Type type)
{
    return Activator.CreateInstance(type);
}

在您的情况下,您似乎不知道编译时的类型是什么,因此您将主要使用 Type类 - 您可以使用 typeof(MyClass)获取相应Type的实例对于运行时已知的类,并且 myObject.GetType()在运行时获取对象的类型信息。

关于c# - 动态类型传递和实例化——如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6664947/

相关文章:

c# - 复杂的 LINQ-TO-SQL 解决方案......或者只是我的经验不足?

c# - 我无法正确计算这个简单的计算

c# - 更新数据库命令在 ASP.Net Core/Entity Framework Core 中不起作用,因为数据库中的对象已经存在

php - 如何创建从数据库驱动的动态菜单和页面?

c - 在 C 中使用 malloc 将文本文件读入数组

c# - 事件对使用 TaskCompletionSource 的异步方法

c# - 在 C# 中将 reg 值写入本地计算机

javascript - 将自定义属性分配给动态生成的 JS 函数

c++ - C++中的动态二维数组,需要在每一行和整个数组中乘以偶数

java - Android 以编程方式添加 View 重复索引