![](/img/trans.png)
[英]C#: specialized template method - Error: Type '…' already defines a member called '…' with the same parameter types
[英]In C#, what is a good method for dealing with long template type names that include protected nested types?
我有一個C#類,其中的方法采用和返回看起來像這樣的類型:
Dictionary<ClassWithLongNameA, Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType> >
或這個:
Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType>
這就造成了一些麻煩且冗長且難以閱讀的方法定義。 如果這是C ++,我可以通過使用typedef使代碼更具可讀性,但是C#中不提供。
我知道通過閱讀此問題 ,我可以以類似於C ++中的typedef
的方式使用using
語句,但是由於兩個原因,它對我不起作用:
它僅適用於一個源文件,我需要它與使用我的類和/或從其繼承的所有源文件一起使用
如果模板參數之一是受保護的或私有的嵌套類型(因為using
語句將無法訪問),則無法使用它,這就是我的情況
我沒有在該問題中看到其他任何答案,特別是對我的問題而言,這似乎是一個很好的解決方案。
還有其他一些解決此問題的好方法嗎?
編輯:這個問題是不是重復這個問題,因為在該線程每一個答案,提出了一種using
語句,我已經解釋了為什么這是不恰當的回答我的問題。
正如我的意見建議,你可以創建一個別名類,從最復雜的類型名稱,這將擺脫你的問題派生using
別名僅適用於單個源文件。
public class LongTypeAlias : Dictionary<ClassWithLongNameA, Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType>>
{
}
我將嘗試介紹一些好處/缺點,但是這些列表絕不是全面的。
好處:
using
別名不同) var
(如果這是您首選的編碼樣式) 缺點:
System.Type
對象進行直接比較,則別名類的System.Type
與其實現的類型不同。 System.Type
對象,並避免使用它們作為一個字典鍵 當然,這些內容都沒有涵蓋為什么類型如此之長的根本問題。 我會鼓勵你嘗試重構你能在那里 - ReSharper的(甚至VS2017我認為)提供了大量的,使重命名,提取類等很容易優秀的工具。
用更短的名稱對Dictionary進行子類化。 你甚至不需要身體。
class ShortName : Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType> {}
然后,您可以使用該類聲明方法。
public ShortName GetDictionary()
{
var dict = new ShortName();
dict.Add
(
new ClassWithLongNameB(),
new ClassWithLongNameB.ProtectedStructType()
};
return dict;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.