我的应用程序有以下类:
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接口。我找到了一个类似的article。但是,我的问题稍微复杂一些,因为我的类型根据小部件的类型而变化。
如果有人能让我知道这是否可能,以及如何实现,我将不胜感激。谢谢
发布于 2012-02-27 18:07:18
一种简单的方法
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。但是您说得对,构建参数对象应该放在参数的getter中,因为只有在那里我们才能确保加载WidgetType
除了我们知道WidgetType在那里之外,它本质上与UserType相同
https://stackoverflow.com/questions/9443865
复制相似问题