保持范围变化的类型

问题描述:

我有一个简单的代码位,我想根据某些数据设置一个类型,但是我无法在手前声明它,因为我不知道它将设置为何种类型:保持范围变化的类型

if(data[i].on == true){ 
    Type1 temp = (Type1)data[i]; 
} else { 
    Type2 temp = (Type2)data[i]; 
} 
// scope lost 
temp.call(); 

我该如何保持范围?这有点令人困惑,因为我不知道我需要在if else语句之前设置temp

C#是否有解决方案?

+0

你有Type1,Type2的接口吗? –

+0

他们继承,但即时通讯不使用接口。 Type2继承了type1,因此.call()将始终有效。他们都继承了一个基类。 – Sir

+0

如果他们都有call(),那么在检查之前将变量声明为null,并使用接口或基类。如果这是不可能的,那么使用一个像Action这样的委托,并在创建类型时分配它。 –

我想使.CALL()在类型1作为虚拟方法,和在类型2覆盖它,在范围的对象将是从类型1

基地:

class VirtualBase 
    { 
     public virtual void Call() 
     { 
      Console.WriteLine("This is base Call"); 
     } 
    } 

儿童:

class VirtualChild : VirtualBase 
    { 
     public override void Call() 
     { 
      Console.WriteLine("Child Call"); 
     } 
    } 

呼叫

VirtualTest.VirtualBase vc = new VirtualTest.VirtualChild(); 
    vc.Call(); 

输出:

儿童呼叫

+0

只有在'Type2'中的'call'必须做一些不同的事情时,我们没有任何信息。 – Andrew

+0

如果'Type2'中的'call'没有做任何不同的事情,他不需要声明它。它会自动调用基地中的一个,结果将是“这是基地调用” –

一个可能的解决办法是dynamic object

dynamic temp; 
if(data[i].on == true){ 
    temp = (Type1)data[i]; 
} else { 
    temp = (Type2)data[i]; 
} 
temp.call(); //will work only if both the Type1 and Type2 have call method 
+1

我不会推荐这个,它不反映开发人员的意图,它可以在代码稍微改变后的未来失败。 – Andrew