Как создать правильный InstanceDescriptor для инициализации некоторых свойств - PullRequest
4 голосов
/ 21 июля 2011

Допустим, у меня есть такой класс:

public class Foo
{
    public Foo {}

    public int Titi { get; set; }
    public int Toto { get; set; }
    public int Tata { get; set; }
}

Я могу инициализировать новый экземпляр следующим образом:

var inst = new Foo { Titi = 12, Toto = 42, Tata = 421 };

Но как мне создать правильный дескриптор экземпляра, который выполняет ту же инициализацию, что и выше?

public class FooConverter : TypeConverter
{
    // ...

    public override object ConvertTo(ITypeDescriptorContext context, 
                                     CultureInfo culture, 
                                     object value, 
                                     Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) && value is Foo)
        {
            // Incorrect example because properties wont 
            // be initialized to 12, 42 and 421
            var ctor = typeof(Foo).GetConstructor(Type.EmptyTypes); 

            return new InstanceDescriptor(ctor, null);
         }

         // ...
    }
}

NB1: я спрашиваю об этом, потому что я хочу создать TypeConverter для класса 'Foo' и должен обеспечить преобразование в 'InstanceDescriptor'

NB2: Да, я могу добавить конструктор в класс Foo, который принимает 3 аргумента, но хотел бы избежать этого и также хотел бы знать, какое «описание конструкции» соответствует приведенному выше образцу.

1 Ответ

2 голосов
/ 21 июля 2011

Я не знаю, что вы пытаетесь использовать, но кажется, что InstanceDescriptor не только принимает конструкторы, поэтому вы можете сделать что-то вроде этого:

public static class FooSerialization
{
    public static Foo CreateDesignFooInstance()
    {
        return new Foo { Titi = 12, Toto = 42, Tata = 421 };
    }
}

А потом:

var m = typeof(FooSerialization).GetMethod("CreateDesignFooInstance", 
    BindingFlags.Static | BindingFlags.Public);
var desc = new InstanceDescriptor(m, null);
...