Как создать новый экземпляр того же типа из существующего экземпляра? - PullRequest
0 голосов
/ 02 апреля 2012

Предположим, у меня есть следующий вид кода:

foreach(var x in Mylist)  //MyList is EntitySet
{
//......
}

Я хочу знать тип x и создать еще один новый экземпляр того же типа и клон x в новый экземпляр, например:

foreach(var x in Mylist)
{
  string tyoename = typeof(x).AssemblyQualifiedName; //get the type of x, but i got error here
  //create instance of the type
  //clone x data to new instance 
}

MyList - это динамические данные, x может быть другого типа при изменении Mylist.Как реализовать этот запрос?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Я использую следующий метод расширения:

public static class CloningExtensions
{
    public static T Clone<T>(this T source)
    {
//            var dcs = new DataContractSerializer(typeof(T), null, int.MaxValue, false, true, null);
        var dcs = new System.Runtime.Serialization
          .DataContractSerializer(typeof(T));
        using (var ms = new System.IO.MemoryStream())
        {
            dcs.WriteObject(ms, source);
            ms.Seek(0, System.IO.SeekOrigin.Begin);
            return (T)dcs.ReadObject(ms);
        }
    }
}

Как это:

foreach(var x in Mylist)
{
    var y = x.Clone();
}

Но вы должны быть осторожны с классами, которые не поддерживают сериализацию, потому что этот метод не вызывает конструктор и не инициализирует приватные поля. Я обхожу его, используя метод OnDeserializing / OnDeserialized (определенный для каждого типа, который мне нужно для клонирования)

[OnDeserialized]
private void OnDeserialized(StreamingContext c)
{
    Init();
}
0 голосов
/ 04 апреля 2012

вы можете создавать объекты класса динамически, как это.

T ReturnObject<T>(T x)
{
Type typeDynamic=x.GetType();
Type[] argTypes = new Type[] { };
ConstructorInfo cInfo = typeDynamic.GetConstructor(argTypes);
T instacneOfClass = (T)cInfo.Invoke(null);
return instacneOfClass;
}
...