SORU
7 EKİM 2008, Salı


Nasıl XML kaldırması bir kurucu çağırmadan nesneler oluşturmak mı?

Bazı sihirli XML kaldırması oluyor. Nasıl onun kurucu çağırmadan veri örnek Sözleşme bir tür oluşturmak mı?

Örneğin, bu veri sözleşme göz önünde bulundurun:

[DataContract]
public sealed class CreateMe
{
   [DataMember] private readonly string _name;
   [DataMember] private readonly int _age;
   private readonly bool _wasConstructorCalled;

   public CreateMe()
   {
      _wasConstructorCalled = true;
   }

   // ... other members here
}

DataContractSerializer) bu nesne örneği alınırken, saha _wasConstructorCalled false olduğunu göreceksiniz.

Nasıl XML bunu yapar mı? Bu başkalarının da kullanabileceği bir tekniktir, ya da bizden gizli mi?

CEVAP
7 EKİM 2008, Salı


FormatterServices.GetUninitializedObject() bir kurucu çağırmadan bir örneğini oluşturur. Reflector kullanma ve çekirdek biraz didiklemeye bu kursu buldum .Serileştirme sınıfları Net.

Aşağıda örnek kodu kullanarak test ettik ve iyi çalışıyor gibi görünüyor:

using System;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main()
        {
            // does not call ctor
            var myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass));

            Console.WriteLine(myClass.One); // writes "0", constructor not called
            Console.WriteLine(myClass.Two); // writes "0", field initializer not called
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
            One = 1;
        }

        public int One { get; private set; }
        public readonly int Two = 2;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Enge

    Eric Enge

    2 Kasım 2009
  • MaximumPCMag

    MaximumPCMag

    23 Temmuz 2010
  • Moto Journal

    Moto Journal

    28 Mayıs 2007