1

为清楚起见,我使用 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 }
}

不知何故,我觉得这样做很偷偷摸摸。它工作正常,但我想知道你们如何看待它作为最佳实践。

感谢您的意见,丹尼尔

4

3 回答 3

1

我决定放弃这个实现。我闻起来很臭。

相反,我将在应用层中的 ViewModel 类中完成我需要做的事情。ViewModel 将充当域模型和所有其他相互不了解但在域模型下具有关系的组件的聚合。

于 2011-01-03T07:13:13.100 回答
0

因为它是一本字典,并且您使用键来暗示对象的类型,所以每种类型只能有一个对象。为什么不只使用每种类型的单个成员呢?然后你可以检查它是否为空,而不用担心枚举、字典和强制转换。它也会表现得更好。在这种情况下,我认为最简单的解决方案是最佳实践。我还将记录该属性,以便您班级的用户知道他们可以将其设置为添加功能。

物业:

public Tag TagComponent { get; set; }

添加组件:

myObject.TagComponent = new Tag();

用法:

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

您的想法的主要问题是它剥夺了您的类的静态定义,这将使用户不​​断猜测它在运行时的功能和组件是什么。

于 2011-01-03T04:47:48.010 回答
0

我想要这样的东西:

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>();

它的类型更安全。

如果您正在寻找不同的解决方案,请更详细地描述您想要做什么。

于 2011-01-03T07:24:07.510 回答