Мой первый вопрос о StackOverflow, я чувствую себя запуганным и возбужденным.Инициализатор с использованием строки для DataMember, возвращающей статический объект класса (заводской шаблон) в C#?
Я попытался получить точное поведение для класса с использованием статического объекта в качестве заводского шаблона и быть сериализованным только с типом в виде строки. При десериализации инициализатор должен возвращать статический объект на основе строки.
Это легче сделать в течение, например:
[DataContract]
public class Interpolation
{
[DataMember]
public string Type { get; set; }
public static Interpolation Linear = new Interpolation(...)
}
Я хотел бы получить линейная интерполяция думал различными способами:
var interpolation = Interpolation.Linear;
var linear = new Interpolation
{
Type = "Linear"
};
Первая фабрика модель (вид), вторая используется для десериализации.
У меня есть несколько решений. Обычно у меня есть общий конструктор, и я использую определенные параметры для создания статического объекта. Это стало бы:
[DataContract]
public class Interpolation
{
[DataMember]
public string Type
{
get { return _type; }
set
{
_type = value;
_interpolation = Select(value);
}
}
private string _type = "Linear"; // Default
private Func<double, double[], double[], double> _interpolation;
private Interpolation(Func<double, double[], double[], double> interpolation, string type)
{
_interpolation = interpolation;
_type = type;
}
public static Interpolation Linear = new Interpolation(_linear, "Linear");
private double _linear(double x, double[] xx, double[] yy)
{
...
}
Этот метод не будет работать, если нет общего конструктора (объект слишком сложен, чтобы быть созданы только из параметров). Также статический объект Interpolation.Linear уже существует, я не обязательно хочу его воссоздать.
То, что я хотел бы это
var linear = new Interpolation
{
Type = "Linear"
};
возвращение
Interpolation.Linear
конструктор не может возвращать статический объект класса:
public Interpolation(string type)
{
return Interpolation.Linear; // Won't work
}
Может быть, с помощью отражения .. Спасибо :)
Пожалуйста, обратите внимание, что десериализации не вызывают никаких конструкторов. Объект будет создан непосредственно в памяти. Если после десериализации вам понадобятся некоторые пользовательские действия, просто создайте метод и пометьте его «OnDeserializedAttribute». – dymanoid