2015-03-08 2 views
1

Мой первый вопрос о 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 
} 

Может быть, с помощью отражения .. Спасибо :)

+0

Пожалуйста, обратите внимание, что десериализации не вызывают никаких конструкторов. Объект будет создан непосредственно в памяти. Если после десериализации вам понадобятся некоторые пользовательские действия, просто создайте метод и пометьте его «OnDeserializedAttribute». – dymanoid

ответ

1

new предназначен для создать новый экземпляр. Если вы пытаетесь использовать его для возврата существующего экземпляра, вы делаете это неправильно. Просто придерживаться (вида) одноточечного

var interpolation = Interpolation.Linear; 

Или использовать завод как этот

public static class InterpolationFactory 
{ 
    public static Interpolation GetInterpolation(string type, Func<double, double[], double[], double> interpolation = null) 
    { 
     if (type == "Linear") 
     { 
      return Interpolation.Linear; 
     } 
     else 
     { 
      return new Interpolation(interpolation); 
     } 
    } 
} 
+0

Я не думаю, что это сработает с десериализацией. Когда клиент получает DataContract с типом = «Линейный», я считаю, что он вызовет конструктор без параметров. Итак, мой вопрос, когда десериализуем, как вернуть статический объект класса. – isidore12

+0

Что касается класса InterpolationFactory, я пытался избежать создания второго класса для одного и того же типа объектов. Но я полностью согласен, вы можете использовать значение Type в DataContract для вызова фабричного класса, который вернет ожидаемый объект. – isidore12

+0

@ isidore12, да, вы должны попробовать. Если вы не добьетесь успеха, я попробую позже. – aush