2015-12-14 3 views
-1

У меня есть два класса - Клиент и Страна. У клиента есть свойство, называемое HomeCountry, которое я украсил пользовательским атрибутом под названием «Lookup» и принимает строковый параметр «Страна». Цель состоит в том, что, когда я использую класс Customer, элемент в HomeCountry должен существовать в классе Country (который является списком).C# Общий параметр из строковой переменной

Я использую отражение для повторения класса Customer, он находит атрибут, и я хочу, чтобы он проверял значение в списке элементов страны. До сих пор у меня есть:

foreach (PropertyInfo _pi in object.GetType().GetProperties()) { 
    IEnumerable<Attribute> _attrs = _pi.GetCustomAttributes(); 
    foreach (Attribute _a in _attrs) { 
    Object obj = Activator.CreateInstance(_type, null); 
    // what goes here? 
    } 
} 

У меня есть метод:

public T Populate<T>(params string[] _parameters) 

Я думаю, что я хочу сделать

List<obj> v = populate<obj>(); 

или

List<typeof(obj)> v = populate<typeof(obj)>(); 

но, очевидно, ничего не работает! Кто-нибудь может мне помочь ?

Благодаря

+0

Рассмотрите возможность использования перечисления для своих стран, что позволит вам не делать такой код с отражением. Вы делаете простую вещь очень сложным образом. –

+0

Я не уверен, какой компонент вашего кода действительно содержит список, который вы упомянули. Просьба привести пример того, как вы хотели бы использовать эти классы. –

+0

Если вы перейдете по маршруту перечисления, убедитесь, что вы правильно проверяете ввод. Любое натуральное число будет анализировать на перечисление (при условии, что оно соответствует унаследованному типу номера). – TyCobb

ответ

0

После некоторой охоты вокруг, это ответ я искал ...

MethodInfo method = typeof(class).GetMethod("Populate"); 
method = method.MakeGenericMethod(p.PropertyType); 
_val = method.Invoke(class, new object[] { _prms }); 

Я предполагаю, что мой вопрос был я задавал неправильный вопрос!

0

OK Постараюсь и предоставляют полный пример:

У меня есть класс CUSTOMER_ORDER:

public class CUSTOMER_ORDER { 
    public CUSTOMER_ORDER() {} 

    [Key(0)] 
    public string OrderNumber {get;set;} 
    public MPCCOM_SHIP_VIA ShipVia {get;set;} 
} 

Тогда класс MPCCOM_SHIP_VIA:

public class MPCCOM_SHIP_VIA { 
    public MPCCOM_SHIP_VIA() {} 

    [Key(0)] 
    public string ID {get;set;} 
    public string Description {get;set;} 
} 

У меня есть метод под названием Populate < T>, который принимает класс, а затем использует отражение в цикле все свойства и построить оператор выбора, выполняет его, а затем возвращает данные и заполнит объект:

public T Populate<T>(params string[] @Parameters) 
     { 
      Type _t = typeof(T); 
      dynamic _o = Activator.CreateInstance(typeof(T), null); 

      SqlBuilder _sb = new SqlBuilder(); 
      _sb.Table = string.Format("{0}.{1}", _Owner, _t.Name.ToString()); 
      foreach (PropertyInfo p in _t.GetProperties(Utilities.BindingFlags)) 
      { 
       if (p.GetMethod.IsPrivate == false) _sb.Fields.Add(p.Name.ToString()); 
       IEnumerable<Attribute> _attrs = p.GetCustomAttributes(); 
       foreach (Attribute _a in _attrs) 
       { 
        if (_a.TypeId.ToString().Equals(typeof(Key).FullName)) 
        { 
         int _position = ((Key)_a).Position; 
         try 
         { 
          string _parameter = @Parameters[_position]; 
          _sb.Where.Add(string.Format("{0} = '{1}'", p.Name, _parameter)); 
         } 
         catch {} 
        } 
       } 
      } 

      using (OleDbCommand _cmd = new OleDbCommand()) 
      { 
       _cmd.Connection = this._cn; 
       _cmd.CommandText = _sb.SQL; 
       if (_trn != null) _cmd.Transaction = _trn; 
       _cmd.CommandType = System.Data.CommandType.Text; 
       using (OleDbDataReader _reader = _cmd.ExecuteReader()) 
       { 
        if (_reader.Read()) 
        { 
         for (int x = 0; x < _reader.FieldCount; x++) 
         { 
          foreach (PropertyInfo p in _t.GetProperties(Utilities.BindingFlags)) 
          { 

           if (p.GetMethod.IsPrivate == false) 
           { 
            if (p.Name.Equals(_reader.GetName(x).ToString())) 
            { 
             dynamic _val = _reader.GetValue(x); 
             if (p.ReflectedType.BaseType.Name.Equals("")) 
             { 
              // what goes here! 

             } 
             try 
             { 
              p.GetSetMethod(true).Invoke(_o, new object[] { _val }); 
             } 
             catch { } 
             break; 
            } 
           } 
          } 
         } 
        } 
        else 
        { 
         throw new DatabaseObjectNotFound(_t.Name.ToString(), string.Join(",",@Parameters)); 
        } 
       } 
      } 
      return (T)_o; 

     } 

Так что, как я прочитал приказ, источник DB получает ключ к MPCCOM_SHIP_VIA в соответствующем поле, я хочу вызвать тот же метод Population против объекта MPCCOM_SHIP_VIA с ключом. Надеюсь, это имеет смысл показать, что я хочу делать. И спасибо

+0

О, извините, но потом понял, что мой первый подход состоял в том, чтобы иметь атрибут в классе заказа клиента против ShipVia [Lookup («MPCCOM_SHIP_VIA»)], но потом понял, что я могу просто установить тип и сохранить себе какую-то работу! –

Смежные вопросы