Как сделать клон статических переменных статического класса в c # - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над различными подходами клонирования объектов в c #, но в настоящее время я придерживался простого. У меня есть статический класс со статическими переменными, и я хочу сделать точную копию одной из моих статических переменных. Я набросал структуру кода ниже:

public static class RULE_SET
{
    public static bool IsdataValid;
    public static GCBRequest GCBData;

    public static T Clone<T>(this T source)
    {
        try
        {
            if (!typeof(T).IsSerializable)
            {                   
                throw new ArgumentException("The type must be serializable.", "source");
            }            
            if (Object.ReferenceEquals(source, null))
            {                   
                return default(T);
            }

            IFormatter formatter = new BinaryFormatter();
            Stream stream = new MemoryStream();
            using (stream)
            {
                formatter.Serialize(stream, source);
                stream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(stream);
            }
        }
        catch (Exception ee) { return default(T); }
    }
}

[XmlRoot(ElementName = "GCBRequest")]
    public class GCBRequest
    {
        [XmlElement(ElementName = "PID")]
        public string PID { get; set; }
        [XmlElement(ElementName = "AID")]
        public string AID { get; set; }
        [XmlElement(ElementName = "CID")]
        public string CID { get; set; }
     }

// код для загрузки RULE_SET

    string strJsonRuleset = "{\r\n  \"GCdBINRequest\": {\r\n\"PID\": \"(?s).*#M#20\",\r\n\"AID\": \"(?s).*#O#10\",\r\n\"CID\": \"(?s).*#O#25\"\r\n  }\r\n}";
     public class RULE_SET_LOCAL 
    {
        public static GCBRequest GCBData;
    }
    //from other method
  RULE_SET_LOCAL objParentRuleSet = new RULE_SET_LOCAL(); 
  objParentRuleSet = JsonConvert.DeserializeObject<RULE_SET_LOCAL>(strJsonRuleset);
  RULE_SET.GCBData = objParentRuleSet.GCBData;

// Основной метод, из которого мне нужно создать объект-клон

  Object objRuleset;
  objRuleset =  RULE_SET.GCBData.Clone();

  if(objRuleset == null)
  {
  ** stuck here**
   I don't know why Everytime I got the null object ?
  }
  // but I have use
  objRuleset = RULE_SET.GCBData;
  if(objRuleset != null)
  {
   ** Successfully reached **
   //But I can't do any operation on this object as it will effect the original one.
  } 

Ребята, у вас есть решение / предложение? Пожалуйста, помогите мне понять это, любая помощь будет оценена.

Спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

После долгих поисков я получил этот метод:

    public static T Clone<T>(this T source)
    {
        var serialized = JsonConvert.SerializeObject(source);
        return JsonConvert.DeserializeObject<T>(serialized);
    }

и теперь я могу получить клона, позвонив

 object objRuleset = RULE_SET.Clone<GCBRequest>(RULE_SET.GCBData);
...