C#字符串变量中的泛型参数

本文关键字:泛型 参数 字符串 变量 | 更新日期: 2023-09-27 18:26:48

我有两个类,Customer和Country。Customer有一个名为HomeCountry的属性,我用名为"Lookup"的自定义属性装饰了它,并使用字符串参数"Country"。目的是,当我使用Customer类时,HomeCountry中的项目必须存在于Country类中(恰好是一个列表)。

我正在使用反射来迭代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)>();

但显然什么都不管用!有人能帮我吗?

感谢

C#字符串变量中的泛型参数

好的,我会尝试提供一个完整的例子:

我有一个CUSTOMER_ORDER类:

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

然后MPCOM_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>它接受一个类,然后使用反射来循环所有属性并构建一个select语句,执行它,然后返回数据并填充对象:

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在相应字段中获得MPCOM_SHIP_VIA的键,我想用该键对MPCOM_SHIP_VIA对象调用相同的Populate方法。我希望这能更有意义地展示我想做的事情。感谢

经过一番寻找,这就是我一直在寻找的答案。。。

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

我想我的问题是我问错了问题!