C# 动态类型传递和实例化——如何实现?

C# 动态类型传递和实例化——如何实现?,c#,dynamic,C#,Dynamic,编辑:已更改激活器,仍然无法工作 因此,我对C#相当(非常)陌生,我很确定这是一个骗局,但我已经看完了前面的问题,仍然无法理解所有要点 我试图通过在泛型列表上用映射替换一些重复的代码来减少代码的味道。具体来说,我有这样的代码 var fooNode = node as IFoo; var barNode = node as IBar; var bazNode = node as IBaz; ... if(fooNode != null) return new FooThing(); i

编辑:已更改
激活器
,仍然无法工作

因此,我对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);
}
var-types=新字典
{
{typeof(IFoo),typeof(FooThing)},
{typeof(IBar),typeof(BarThing)},
...
}
foreach(类型中的var条目)
{
var castNode=作为entry.Key的节点;
返回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);
    }
}
问题在于,您将泛型类型参数与运行时类型混淆,尤其是
类型

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

T CreateObject<T>()
{
    return Activator.CreateInstance<T>();
}
在您的例子中,看起来您不知道编译时的类型是什么,所以您将主要使用
Type
类-您可以使用
typeof(MyClass)
为运行时已知的类和
myObject.GetType()获取相应的
Type
实例
在运行时获取对象的类型信息。

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

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

return null;
{ {typeof(IFoo),typeof(FooThing)}, {typeof(IBar),typeof(BarThing)}, ... } foreach(类型中的var条目) { if(entry.Key.IsAssignableFrom(node.GetType())) 返回Activator.CreateInstance(entry.Value); } 返回null;
如果不清楚您希望从同一操作返回不同类型的目的,将很难提供帮助。也许你需要了解一些你想要解决的问题的背景知识

我将假设,由于您试图交替返回它们,fooThing、BartThing和BazThing具有相同的接口。因此,我假设如下:

 public class FooThing : IMyOperations
 {

 }

 public class BarThing : IMyOperations
 {

 }

 public class BazThing : IMyOperations
 {

 }
您可以在另一个接口中定义类之间的关系

 public interface IMyChoice
 {
      public bool IsSelected { get; }
      public IMyOperations GetWorker();
 } 

 public class ChoiceFoo : IMyChoice
 {


 }

 public class ChoiceBar : IMyChoice
 {

 }

 public class ChoiceBaz : IMyChoice
 {

 }
现在你可以说

 foreach( var entry in choices)
 {
    if(entry.IsSelected)
    {
         return entry.GetWorker();
         //Can't remember if i need to break after return..doubt it
    }
 }

不应该是
返回Activator.CreateInstance(entry.Value)---您使用它的方式必须指定编译时类型。这是绝对可能的。我刚刚对代码进行了快速测试,
Activator.CreateInstance
调用对我来说很好。编译器找不到迭代变量很奇怪。似乎还有其他问题。可能应该是'entry.Value'——键是接口type@katrielalex你想用那个演员做什么?如果您想知道对象是否可从给定类型分配,则可以使用
IsAssignableFrom
,例如
entry.Key.IsAssignableFrom(node.GetType())
 foreach( var entry in choices)
 {
    if(entry.IsSelected)
    {
         return entry.GetWorker();
         //Can't remember if i need to break after return..doubt it
    }
 }