簡體   English   中英

在C#中,什么是處理包含受保護的嵌套類型的長模板類型名稱的好方法?

[英]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語句,但是由於兩個原因,它對我不起作用:

  1. 它僅適用於一個源文件,我需要它與使用我的類和/或從其繼承的所有源文件一起使用

  2. 如果模板參數之一是受保護的或私有的嵌套類型(因為using語句將無法訪問),則無法使用它,這就是我的情況

我沒有在該問題中看到其他任何答案,特別是對我的問題而言,這似乎是一個很好的解決方案。

還有其他一些解決此問題的好方法嗎?

編輯:這個問題是不是重復這個問題,因為在該線程每一個答案,提出了一種using語句,我已經解釋了為什么這是不恰當的回答我的問題。

正如我的意見建議,你可以創建一個別名類,從最復雜的類型名稱,這將擺脫你的問題派生using別名僅適用於單個源文件。

public class LongTypeAlias : Dictionary<ClassWithLongNameA, Dictionary<ClassWithLongNameB, ClassWithLongNameB.ProtectedStructType>>
{
}

我將嘗試介紹一些好處/缺點,但是這些列表絕不是全面的。

好處:

  1. 解決當前的問題:類型名稱現在更短! (因為它是不同的類型)
  2. 應用於項目中的每個源文件(與using別名不同)
  3. 允許您在聲明中指定類型,而不使用var (如果這是您首選的編碼樣式)

缺點:

  1. 如果您依靠反射,它可能無法按預期工作
    • 如果您曾經與System.Type對象進行直接比較,則別名類的System.Type與其實現的類型不同。
    • 可能的解決方法:避免直接與比較System.Type對象,並避免使用它們作為一個字典鍵
  2. 代碼可讀性可能會受到影響
    • 根據您所覆蓋的類型,你可能會失去表明它是什么類實際上了一些重要的/有用的信息
    • 可能的解決方法:全面/簡潔地命名別名類型
  3. 由於兩種類型代表同一對象,因此項目可能無法維護
    • 根據項目的編碼標准,則可能會命名空間污染,太多的源文件,或一般的混亂,“這是為什么在這里”
    • 可能的解決方案:將別名類型放在單獨的命名空間中,和/或在與別名類相同的文件中定義它們

當然,這些內容都沒有涵蓋為什么類型如此之長的根本問題。 我會鼓勵你嘗試重構你能在那里 - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM