0

我的应用程序有以下类:

public class Widget {        
    public virtual int Id { get; set; }
    public virtual WidgetType Type { get; set; }
    public virtual string Parameters { get; set; }
}

public class WidgetType {        
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string ParametersAssembly { get; set; }
    public virtual string ParametersClass { get; set; }
}

现在,如果我想更新特定小部件的参数,我会说:

// Get the widget
var widget = GetWidget(1);

// Create an instance of the type parameters class
var parameters = Activator.CreateInstance(Assembly.LoadFrom(Server.MapPath("~/bin/"
    + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass));

... Code here to update the parameters

widget.Parameters = new XmlSerializer(parameters.GetType()).Serialize(parameters);

当我希望获取参数时,我必须做相反的事情。你可以想象这变得相当乏味。我想知道是否可能自动执行此操作?

我一直在看 IUserType 接口。我找到了一篇类似的文章。但是我的问题有点复杂,因为我的类型会根据小部件的类型而变化。

如果有人能让我知道这是否可能以及如何实现,我将不胜感激。谢谢

4

1 回答 1

1

一个简单的方法

public class Widget
{
    public virtual int Id { get; set; }
    public virtual WidgetType Type { get; set; }

    private string _serializedParameters;
    private virtual string SerializedParameters {
        get
        {
            return new XmlSerializer(Parameters.GetType()).Serialize(Parameters);
        }
        set
        {
            _serializedParameters = value;
            // code to deserialize the Parameters and set to Parameters
            var ptype = Assembly.LoadFrom(Server.MapPath("~/bin/" + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass);
            Parameters = Activator.CreateInstance(ptype);
        }
    }
    private object _parameters;
    public virtual object Parameters
    {
        get
        {
            if (_parameters == null)
                _parameters = Activator.CreateInstance(Assembly.LoadFrom(Server.MapPath("~/bin/" + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass));
            return _parameters;
        }
        set { _parameters = value; }
    }
}

它不能在 Parameters 属性中,因为那样你必须get -> alter -> set代替get -> alter. 但是你是对的,构建参数对象应该进入参数的获取器,因为只有在那里我们才能确保加载了 WidgetType

它本质上与 UserType 相同,只是我们知道 WidgetType 存在

于 2012-02-27T10:07:18.287 回答