문제

내 응용 프로그램에는 다음 클래스가 있습니다:

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

나는 매개 변수를 얻고 자 할 때 그 반대를해야한다.당신은 이것이 매우 지루하게 상상할 수 있습니다.이 작업을 자동으로 수행 할 수 있는지 궁금했습니다.

나는 아이유저 타입 인터페이스를 찾고 있었다.나는 발견 기사 어떤 종류의 비슷합니다.그러나 내 문제는 위젯의 유형에 따라 내 유형이 변경됨에 따라 조금 더 복잡합니다.

누군가가 이것이 가능한지,그리고 그것이 어떻게 달성 될 수 있는지 알려줄 수 있다면 나는 그것을 감사 할 것입니다.감사

도움이 되었습니까?

해결책

쉬운 방법

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

그런 다음해야하기 때문에 매개 변수 속성에있을 수 없습니다 get -> alter -> set 대신 get -> alter.그러나 매개 변수 객체를 구축하는 것은 매개 변수의 게터에 가야한다는 것이 옳습니다.왜냐하면 거기에서만 우리는 위지 타입을 로드 할 수 있기 때문입니다.

그것은 기본적으로 사용자 타입과 동일하지만 우리는 위지 타입이 있다는 것을 알고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top