具有通用类型 T 的 SetValue
SetValue with generic type T
我有这个功能:
变量 c
获得了我的 class <T>
的所有属性
在这种情况下:
c
->
Id
Key
Value
public List<T> ReadStoreProceadure<T>(string storeName)
{
var result = new List<T>();
var instance = (T) Activator.CreateInstance(typeof (T), new object[] {});
var c = typeof (T);
var data = DataReader.ReadStoredProceadures(_factibilidad, storeName); // This part is returning verified data and it's ok
while (data.Read())
{
if (data.HasRows)
{
foreach (var item in c.GetProperties())
{
//item.SetValue(c, item.Name, null);
}
}
}
}
如何将这些值添加到我的实例 instance
并将其添加到我的 result
变量?
可能吗?
我已经为 IDataReader
创建了一个扩展方法,它基本上完成了我认为您正在尝试做的事情:
public static List<T> ToList<T>(this IDataReader dr) where T: new()
{
var col = new List<T>();
var type = typeof(T);
var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
while (dr.Read())
{
var obj = new T();
for (int i = 0; i < dr.FieldCount; i++)
{
string fieldName = dr.GetName(i);
var prop = props.FirstOrDefault(x => x.Name.ToLower() == fieldName.ToLower());
if (prop != null)
{
if (dr[i] != DBNull.Value)
{
prop.SetValue(obj, dr[i], null);
}
}
}
col.Add(obj);
}
dr.Close();
return col;
}
但是,您会注意到我选择了从另一个方向来处理。我没有迭代类型的属性并从 DataReader 中获取它们,而是迭代 DataReader 列并检查类型上的匹配 属性。您应该能够快速修改它以适合您的数据检索方案。
我有这个功能:
变量 c
获得了我的 class <T>
的所有属性
在这种情况下:
c
->
Id
Key
Value
public List<T> ReadStoreProceadure<T>(string storeName)
{
var result = new List<T>();
var instance = (T) Activator.CreateInstance(typeof (T), new object[] {});
var c = typeof (T);
var data = DataReader.ReadStoredProceadures(_factibilidad, storeName); // This part is returning verified data and it's ok
while (data.Read())
{
if (data.HasRows)
{
foreach (var item in c.GetProperties())
{
//item.SetValue(c, item.Name, null);
}
}
}
}
如何将这些值添加到我的实例 instance
并将其添加到我的 result
变量?
可能吗?
我已经为 IDataReader
创建了一个扩展方法,它基本上完成了我认为您正在尝试做的事情:
public static List<T> ToList<T>(this IDataReader dr) where T: new()
{
var col = new List<T>();
var type = typeof(T);
var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
while (dr.Read())
{
var obj = new T();
for (int i = 0; i < dr.FieldCount; i++)
{
string fieldName = dr.GetName(i);
var prop = props.FirstOrDefault(x => x.Name.ToLower() == fieldName.ToLower());
if (prop != null)
{
if (dr[i] != DBNull.Value)
{
prop.SetValue(obj, dr[i], null);
}
}
}
col.Add(obj);
}
dr.Close();
return col;
}
但是,您会注意到我选择了从另一个方向来处理。我没有迭代类型的属性并从 DataReader 中获取它们,而是迭代 DataReader 列并检查类型上的匹配 属性。您应该能够快速修改它以适合您的数据检索方案。