Domanda

La mia applicazione ha le seguenti classi:

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; }
}

Ora, se vorrei aggiornare i parametri per un determinato widget direi qualcosa di simile:

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

Devo fare il contrario quando desidero ottenere i parametri. Puoi immaginare che questo diventi piuttosto noioso. Mi chiedevo se fosse forse fare automaticamente questo?

Ho guardato l'interfaccia IUSERTYPE. Ho trovato un articolo che è un po 'simile. Tuttavia, il mio problema è un po 'più complicato poiché il mio tipo cambia in base al tipo di widget.

Lo apprezzerei se qualcuno potesse farmi sapere se questo è possibile e forse come potrebbe essere raggiunto. Grazie

È stato utile?

Soluzione

un modo semplice

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; }
    }
}

non può essere nella proprietà dei parametri perché allora devi get -> alter -> set invece di get -> alter. Ma hai ragione sul fatto che la costruzione dell'oggetto parametri dovrebbe andare nel getter di parametri perché solo lì possiamo essere sicuri di caricare il widgetType

È essenzialmente lo stesso di un tipo di utente, tranne per il fatto che sappiamo che è lì widgetType

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top