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)>();
但显然什么都不管用!有人能帮我吗?
感谢
好的,我会尝试提供一个完整的例子:
我有一个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 });
我想我的问题是我问错了问题!