Question

Mon application a les classes suivantes:

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

Maintenant, si je voudrais mettre à jour les paramètres d'un widget particulier, je dirais quelque chose comme:

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

Je dois faire l'inverse quand je souhaite obtenir les paramètres. Vous pouvez imaginer que cela devient assez fastidieux. Je me demandais si c'était peut-être pour le faire automatiquement?

J'ai regardé l'interface iUserType. J'ai trouvé un article ce qui est un peu similaire. Cependant, mon problème est un peu plus compliqué car mon type change en fonction du type de widget.

J'apprécierais que quelqu'un puisse me faire savoir si cela est possible et peut-être comment cela pourrait être réalisé. Merci

Était-ce utile?

La solution

une voie facile

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

il ne peut pas être dans la propriété Paramètres car alors vous devez get -> alter -> set à la place de get -> alter. Mais vous avez raison de constater que la construction de l'objet Paramètres devrait aller dans le Getter des paramètres car seulement là, nous pouvons être sûrs de charger le widgetType

C'est essentiellement la même chose qu'un type utilisateur, sauf que nous savons que WidgetType est là

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top