2010-01-14 19 views
0

我有這個類正在接受從代碼中不同位置調用的Dictionary<string,object>。字典的概念使事情變得沒有類型化,很難弄清楚要傳遞類的功能,否則會引發運行時異常。由於這個Dictionary<string,object>是一個契約定義,所以我必須編寫一個擴展方法來在調用我的類時將我的類型轉換爲字典。但現在我怎麼能關閉這個類,它只接受一個特定的類型如何關閉一個類只接受特定的類型化對象

因此,例如。

public class CreateReport : IRep 
{ 

public void SetParam(Dictionary<string,object> parm) 
{ 
// Here the dictionary param are been set. 
} 

public object RunRep() 
{ 

} 
} 

ClassInvoker.Invoke(CreateReport , Dictionary<string,object>{"MyParam" , "World"}); 

所以這就是現在的情況。

我已經通過創建一個屬性類改變它作爲

public class CreateReportProp 
{ 
    public string MyParam { get;set;} 
} 

並具有擴展的方法ConvertObjToDict

所以現在我們必須做的是這樣

ClassInvoker.Invoke(CreateReport , new CreateReportProp { MyParam = "World"}.ConvertObjToDict()); 

但我會喜歡去進一步關閉類,這樣CreateReportClass你只能通過CreateReportParam否則編譯器會拋出一個外部上。

請給我一些想法,我該如何實現這一目標。

+0

拋出異常是在運行時發生的。編譯器不(通常)拋出異常。 – 2010-01-14 12:37:33

回答

0

我相信你正在使用的CREATEREPORT類的許多具體的報告?如果是這種情況,您有機會制定編譯時檢查。如果CreateReport類動態調用報表,即按名稱,並且每個報表具有不同的參數要求,則不存在編譯時檢查的可能性。

在第一種情況下,你會改變簽名的CREATEREPORT類,如下所示:

public class CreateReport<T> : IRep, where T : CreateReportProp 

在通過setParam方法,你就必須

public void SetParam(T param) 

對於您可以創建每個特定的報告一個不同的屬性類,只要它從CreateReportProp繼承。然後,當您實例化報告類時,您將指定該類。

CreateReport<MySpecificParam> myReport = new CreateReport<MySpecificParam>(); 
myReport.SetParam(new MySpecificParam() {...}); 

如果你希望做CREATEREPORT類內變化較少,你可以有你的CreateReportProp實現一個IEnumerable或IDictionary的接口,這樣迭代的參數是更通用。

0

爲什麼不使用強類型的字典:

public void SetParam<T>(Dictionary<string, T> parm) 
{ 
} 
+0

嗨達林, 對不起,我沒有詳細註明其用途不強類型dictionary.But我的問題是多與我如何關閉類做只接受特定類型這反過來會通過反正我的擴展方法轉換爲字典。但現在,你可以看到我可以傳遞任何類型到調用類,我只會得到運行時異常。我想要的是編譯時間。 – netmatrix01 2010-01-14 12:40:15

0

我會用一個通用接口 需要2個接口,使用強類型的字典的通用類型化intherface。 然後你可以使用接口,而不用擔心類,因爲每個實現接口的類都會關注如何處理數據。

public interface IExample<t> : IExample 
{ 
AddDictionary(T); 
} 

public interface IExample 
{ 
AddDictionary(object) 
} 

然後寫對象版本投入到打字版本並在那裏執行。

添加你需要的任何其他泛型方法,然後你正在使用的類將自己管理,所有應該是hunky dory ......就是說,如果我正確地理解你。

0

您可以使用限制泛型,其中關鍵字。下面是使用一個簡單的例子鏈表

public class LinkedList<K,T> where K : IComparable 
{ 
    T Find(K key) 
    { 
     Node<K,T> current = m_Head; 
     while(current.NextNode != null) 
     { 
     if(current.Key.CompareTo(key) == 0) 

      break; 
     else  

      current = current.NextNode; 
     } 
     return current.Item; 
    } 
    //Rest of the implementation 
} 
相關問題