2011-08-08 131 views
0

我對此感到困惑。但這是我想要做的。這裏是類結構:通過泛型加載類

public class Order 
{ 
    public Int32 orderID { get; set; } 
    public Int32 CustomerID { get; set; } 
    public Int32 ProductID { get; set; } 
    public string OrderName { get; set; } 
    public Product ProductDetails { get; set; } 
    public Customer CustomerDetails { get; set; } 

} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 
    public string Name { get; set; } 
} 

public class Customer 
{ 
    public Int32 CustomerID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

我建立一個通用的方法,即採用XML內容,並創建和裝載傳入的對象類型的實例。我得到了產品和客戶的工作。但是當涉及到訂單時,它會讓人感到困惑。

public static T LoadObject<T>(string Contents) where T : new() 
    { 
     T obj = new T(); 
     foreach (PropertyInfo property in typeof (T).GetProperties()) 
     { 
      if (property.PropertyType.IsValueType || property.PropertyType.IsPrimitive) 
      { 
       object propValue = Convert.ChangeType(GetValue(property.PropertyType, Contents), 
                 property.PropertyType); 
       property.SetValue(obj, propValue, null); 
      } 
      else 
      { 
       //Type typeArgument = property.PropertyType; 
       //Type genericClass = t 
       //object propValue = LoadObject<> (dr); 
       //property.SetValue(obj, propValue, null); 
      } 
     } 
     return obj; 
    } 

如何以遞歸方式調用此命令,以便訂購客戶和產品?

+0

你不能使用XmlSerializer來完成這個嗎? –

+0

這些類都很小,所以我不太明白你爲什麼需要這樣一個通用的解決方案(YAGNI原則......)。我只是爲它們中的每一個實現了一些「FromXml」方法,並且使它成爲接口方法或其他東西。考慮到反射實際上非常緩慢 - 當你需要處理數以千計的訂單時,它會很明顯。一遍又一遍地檢索同一個PropertyInfo是很昂貴的。 –

+0

這只是我提出的一個例子,以更好地解釋問題。事實上,這些不是課程。而且輸入也不一定是XML。 – katie77

回答

0

您可以使用反射來進行遞歸調用:

public void Test<T>() 
{ 
    var methodInfo = GetType().GetMethod("Test"); 
    methodInfo = methodInfo.MakeGenericMethod(typeof(int)); 
    methodInfo.Invoke(this, new object[0]); 
} 
0

的事情是,你不能叫LoadObject<T>其中T將是property.PropertyType,因爲你不能在編譯時使用帶有參數未知的仿製藥。我自己也遇到了這樣的問題,我曾經問過一個與你的問題有些相關的問題:Generic static class - retrieving object type in run-time(相關 - 如果我理解你的話,那就是,否則不管它)。

0

通常,在這種情況下您要做的是在Order類中創建Customer和Product實例,並在Order類上使用Load方法來填充Order,然後填充Customer實例和Product實例。

public class Order 
{ 
    public void LoadOrder(int orderID) 
    { 
     //load order 

     //load customer from order 

     //load product from order 
    } 

    public Customer Cust 
    { 
     get; set; 
    } 
    public Product Prod 
    { 
     get; set; 
    } 
} 

我知道你問的是有點不同,但希望這有助於。