.Net Reflection calling a function with a generic parameter - 如何将类型传递给函数
.Net Reflection calling a function with a generic parameter - How to pass the type to the function
嗨,这是我的第一个问题!我真的在为这些代码而苦苦挣扎:
我有这些 class:
public class Home {
public List<Parameter> Parameter { get; set; }
}
我也有这个规格的功能:
public static List<T> DataTableMapToList<T>(DataTable dtb)
{ ... }
在另一个 class 中,当我需要调用这些函数时,我需要传递我 class 的类型,但我在反射属性循环中:
public void Initialize(ref object retObject)
{
using (var db = this)
{
db.Database.Initialize(force: false);
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = sStoredProcedure;
try
{
// Run the sproc
db.Database.Connection.Open();
DbDataReader reader = cmd.ExecuteReader();
DataSet ds = new DataSet();
ds.EnforceConstraints = false;
ds.Load(reader, LoadOption.OverwriteChanges, sTables);
var propertys = GetGenericListProperties(retObject);
foreach (DataTable table in ds.Tables) {
foreach (var info in propertys)
{
if (info.Name == table.TableName)
{
Type myObjectType = info.PropertyType;
// Create an instance of the list
var list = Activator.CreateInstance(myObjectType);
var list2 = DataTableMapToList<???>(table).ToList();
//Where the variable myObjectType is the TYPE of the class where I need to pass on the ??? marker
info.SetValue(retObject, list, null);
}
}
}
}
finally
{
db.Database.Connection.Close();
}
}
}
其中:
retObject -> Home 的一个实例;
信息 -> 这是 Home.Parametro 属性;
我想通过反射动态设置 属性。无需调用具有泛型类型的函数,一切正常。但是我需要调用函数来正确填充 属性。
我什么都试过了:
作为对象传递并在之后尝试转换(我收到必须实现 IConverter 的错误);
试图将我的所有代码(仅用于测试)放入 DataTableMapToList() 中,但即便如此我还是遇到了对象转换错误;
为我的最终变量强制发送列表,但我再次遇到转换器错误。;
我不知道我是否足够清楚我真正需要什么,但我花了大约 4 个小时寻找解决方案直到知道。
鉴于有一个 class 具有静态泛型函数:
public static class Utils
{
public static List<T> DataTableMapToList<T>(DataTable dtb)
{ ... }
}
可以通过反射调用:
IEnumerable InvokeDataTableMap(DataTable dtb, Type elementType)
{
var definition = typeof(Utils).GetMethod("DataTableMapToList");
var method = definition.MakeGenericMethod(elementType);
(IEnumerable) return method.Invoke(null, new object[]{dtb});
}
嗨,这是我的第一个问题!我真的在为这些代码而苦苦挣扎:
我有这些 class:
public class Home {
public List<Parameter> Parameter { get; set; }
}
我也有这个规格的功能:
public static List<T> DataTableMapToList<T>(DataTable dtb)
{ ... }
在另一个 class 中,当我需要调用这些函数时,我需要传递我 class 的类型,但我在反射属性循环中:
public void Initialize(ref object retObject)
{
using (var db = this)
{
db.Database.Initialize(force: false);
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = sStoredProcedure;
try
{
// Run the sproc
db.Database.Connection.Open();
DbDataReader reader = cmd.ExecuteReader();
DataSet ds = new DataSet();
ds.EnforceConstraints = false;
ds.Load(reader, LoadOption.OverwriteChanges, sTables);
var propertys = GetGenericListProperties(retObject);
foreach (DataTable table in ds.Tables) {
foreach (var info in propertys)
{
if (info.Name == table.TableName)
{
Type myObjectType = info.PropertyType;
// Create an instance of the list
var list = Activator.CreateInstance(myObjectType);
var list2 = DataTableMapToList<???>(table).ToList();
//Where the variable myObjectType is the TYPE of the class where I need to pass on the ??? marker
info.SetValue(retObject, list, null);
}
}
}
}
finally
{
db.Database.Connection.Close();
}
}
}
其中: retObject -> Home 的一个实例; 信息 -> 这是 Home.Parametro 属性;
我想通过反射动态设置 属性。无需调用具有泛型类型的函数,一切正常。但是我需要调用函数来正确填充 属性。
我什么都试过了:
作为对象传递并在之后尝试转换(我收到必须实现 IConverter 的错误);
试图将我的所有代码(仅用于测试)放入 DataTableMapToList() 中,但即便如此我还是遇到了对象转换错误;
为我的最终变量强制发送列表,但我再次遇到转换器错误。;
我不知道我是否足够清楚我真正需要什么,但我花了大约 4 个小时寻找解决方案直到知道。
鉴于有一个 class 具有静态泛型函数:
public static class Utils
{
public static List<T> DataTableMapToList<T>(DataTable dtb)
{ ... }
}
可以通过反射调用:
IEnumerable InvokeDataTableMap(DataTable dtb, Type elementType)
{
var definition = typeof(Utils).GetMethod("DataTableMapToList");
var method = definition.MakeGenericMethod(elementType);
(IEnumerable) return method.Invoke(null, new object[]{dtb});
}