2009-12-16 13 views
8

Aşağıdaki işlev, bazen belirli bir türden bir dizi olabilen bir nesneyi kabul eder. Bu durumda, türün en az bir üye olduğu varsayılarak, objenin [0] .GetType() ile belirlenebileceğini varsayalım. Bu tür bir diziyi uygun türde genel bir Liste <T> dönüştürmek istiyorum, ancak aşağıdaki kod yalnızca <nesnesinin> nesnesine dönüştürmede başarılı olur. Bu nasıl yapılabilir? GetSerializedObject() IDataContractSurrogate arayüzüne ait bir işlev uygular, bu yüzden gösterildiği gibi onun imzasını değiştirebilir sanmıyorumHerhangi bir türde diziyi Listeye dönüştür dönüştürme <T> (C#)

 
     public object GetDeserializedObject(object obj, Type targetType) 
     { 
      if (obj is Array) 
      { 
       List<object> obj2 = new List<object>(); 
       for (int i = 0; i < ((Array)obj).Length; i++) 
       { 
        obj2.Add(((object[])obj)[i]); 
       } 
       obj = obj2; 
      } 
      return obj; 
     } 

Not.

cevap

16

istediğiniz türünü belirtmek gerekir, sen' Bunu yapmak için genel bir yöntem oluşturmak ve yansıma ile aramak istiyorum. Örneğin:

private static List<T> ConvertArray<T>(Array input) 
{ 
    return input.Cast<T>().ToList(); // Using LINQ for simplicity 
} 

public static object GetDeserializedObject(object obj, Type targetType) 
{ 
    if (obj is Array) 
    { 
     MethodInfo convertMethod = typeof(...).GetMethod("ConvertArray", 
      BindingFlags.NonPublic | BindingFlags.Static); 
     MethodInfo generic = convertMethod.MakeGenericMethod(new[] {targetType}); 
     return generic.Invoke(null, new object[] { obj }); 
    } 
    return obj; 
} 

(Eğer derleme sırasında türünü biliyor musunuz , sadece bunu bir genel yöntem yapmak ve doğrudan Cast ve ToList diyoruz.) bambaşka bir yöne gideceğini

+2

"..." yerine ne aittir? –

+1

@nw: Jon'un tanımladığı "ConvertArray" yöntemini yerleştirdiğiniz sınıf. Yani, 'ArrayConverter' adlı bir dizide 'ConvertArray 'yöntemini kullanırsanız,' ArrayConverter' ile '...' değiştirin. – jason

+1

@Jon: 'TargetType'' Type' olmalıdır. – jason

3

Cast deneyin() Linq yöntemi:

public object GetDeserializedObject<T>(object obj) 
    { 
     if (obj is Array) 
     { 
      var list = ((Array)obj).Cast<T>().ToList(); 
      obj = list; 
     } 
     return obj; 
    } 

Ve derleme sırasında türünü bilmediğimi varsayarsak T.

+1

ama bu çok daha şık. – rossipedia

+2

GetSerializedObject(), IDataContractSurrogate arabirimine ait bir işlev uygular, bu nedenle imzasını gösterildiği gibi değiştirebileceğimi düşünmüyorum. –

İlgili konular