2016-05-14 50 views
0

我有一個簡單的代碼位,我想根據某些數據設置一個類型,但是我無法在手前聲明它,因爲我不知道它將設置爲何種類型:保持範圍變化的類型

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這樣的委託,並在創建類型時分配它。 –

回答

1

我想使.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'沒有做任何不同的事情,他不需要聲明它。它會自動調用基地中的一個,結果將是「這是基地調用」 –

0

一個可能的解決辦法是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