2011-07-21 132 views
4

可以說我有一個這樣的類:如何建立正確的初始化InstanceDescriptor初始化一些屬性

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,並需要提供皈依到「初始化InstanceDescriptor」

NB2:是的,我可以添加構造來富這個類需要3個參數,但是想要避免這個,並且想知道哪個「構造描述」對應於上面的示例。

回答

2

我不知道你要使用什麼,但它似乎初始化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); 
+0

是的,我看到我也可以使用MemberInfo,PropertyInfo ...嘗試類似這樣的事情,即使不太熟悉它也會讓你知道 – CitizenInsane

+0

在使用'Foo'類時,Visual Studio設計器仍然崩潰實施FooConverter並沒有問題。這樣做了嗎?public static Foo ConvertToInstance(Foo inst) return inst.Clone();如果(destinationType == typeof(InstanceDescriptor)&& value爲Foo) }'和'if(destinationType == typeof(InstanceDescriptor)&& value is Foo) var m = typeof(FooConverter).GetMethod(「ConvertToInstance」,BindingFlags.Static | BindingFlags.Public); return new InstanceDescriptor(m,new object [] {value}); }' – CitizenInsane

0

使用relection在實例創建後設置屬性。這是更容易的選項恕我直言。

你想通過約定達到什麼目的?

您能否提供一個更具體的例子?

+0

我不想創建實例,我想創建如何創建實例的描述(爲foo類創建類型轉換器)。我已經更新了我的示例以更清晰。 – CitizenInsane