首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate -用于更改类型的IUserType?

NHibernate -用于更改类型的IUserType?
EN

Stack Overflow用户
提问于 2012-02-25 20:11:58
回答 1查看 165关注 0票数 0

我的应用程序有以下类:

代码语言:javascript
复制
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; }
}

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

代码语言:javascript
复制
// 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。但是,我的问题稍微复杂一些,因为我的类型根据小部件的类型而变化。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-27 18:07:18

一种简单的方法

代码语言:javascript
复制
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相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9443865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档