簡體   English   中英

有關在C#中創建通用對象字典的最佳實踐? 這不好嗎?

[英]Best practices about creating a generic object dictionary in C#? Is this bad?

為了清楚起見,我使用的是C#3.5 / Asp.Net MVC 2

這是我所做的事情:我希望能夠在運行時向對象添加/刪除功能。 因此,我只需向類中添加一個通用對象字典,如下所示:

public Dictionary<int, object> Components { get; set; }

然后,我可以在運行時將任何類型的.Net對象添加/刪除到該字典中。 要插入一個對象,我要做這樣的事情:

var tag = new Tag();
myObject.Components.Add((int)Types.Components.Tag, tag);

然后要檢索,我只是這樣做:

if(myObject.Components.ContainsKey((int)Types.Components.Tag))
{    
    var tag = myObject.Components[(int)Types.Components.Tag] as Tag;
    if(tag != null) { //do stuff }
}

我莫名其妙地這樣做了。 可以,但是我想知道你們如何看待它是最佳實踐。

感謝您的輸入,丹尼爾

我決定放棄此實現。 對我來說很難聞。

相反,我將在應用程序層中的ViewModel類中完成我需要做的事情。 ViewModel將充當域模型和彼此不知道但在域模型下具有關系的所有其他組件的集合。

因為它是字典,並且您使用鍵來隱含對象的類型,所以每種類型只能有一個對象。 為什么不只是每個類型只有一個成員呢? 然后,您可以檢查它是否為空,而不用擔心枚舉,字典和強制轉換。 它也會表現更好。 我認為,在這種情況下,最簡單的解決方案就是最佳實踐。 我還將記錄該屬性,以便您的類的用戶知道他們可以將其設置為添加功能。

物業:

public Tag TagComponent { get; set; }

添加組件:

myObject.TagComponent = new Tag();

用法:

if (TagComponent != null)
{
  //do stuff
}

您的想法的主要問題是,它剝奪了您的類的靜態定義,這將使用戶不​​斷猜測其運行時的功能和組件。

我會改成這樣:

public class CoolClassName
{
    private Dictionary<Type, object> _items = new Dictionary<Type, object>();


    public T Get<T>()
    {
        T value;
        if (_items.TryGetValue(typeof(T), out value)
           return (T)value;

        return null;
    }

    public void Set<T>(T value)
    {
        _items[typeof(T)] = value;
    }
}

用法:

coolClass.Set<IUser>(new User{FirstName = "Jonas"});
var user = coolClass.Get<IUser>();

它更安全一些。

如果您正在尋找其他解決方案,請更詳細地描述您想要做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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