Загрузка класса через Generics - PullRequest
0 голосов
/ 09 августа 2011

Я запутался с этим.Но вот что я пытаюсь сделать.Вот структура класса:

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;
    }

Как я могу назвать это рекурсивно, чтобы Заказ загружал клиента и продукт?

Ответы [ 3 ]

0 голосов
/ 09 августа 2011

Дело в том, что вы не можете вызвать LoadObject<T>, где T будет иметь property.PropertyType, потому что вы не можете использовать обобщенные параметры с параметром unknown во время компиляции.Я сам столкнулся с такой проблемой и однажды задал вопрос, несколько связанный с вашей проблемой: Общий статический класс - получение типа объекта во время выполнения (связанный - если я вас правильно понял, то есть. В противном случае не обращайте на него внимания).

0 голосов
/ 09 августа 2011

Как правило, в этой ситуации вы будете создавать экземпляры Customer и Product в классе Order и использовать метод Load в классе Order для заполнения 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;
   }
}

Я знаю, что вы спрашивали, было немного по-другому, но, надеюсь, это поможет.

0 голосов
/ 09 августа 2011

Вы можете использовать Reflection для выполнения рекурсивных вызовов:

public void Test<T>()
{
    var methodInfo = GetType().GetMethod("Test");
    methodInfo = methodInfo.MakeGenericMethod(typeof(int));
    methodInfo.Invoke(this, new object[0]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...