我有一个接受通用 T 类的方法
public void CreateTables<T>()
{
string name = typeof(T).Name;
var fields = typeof(T).GetProperties().Select(t => new { key =
t.Name.ToLower(CultureInfo.InvariantCulture), value =
SqLiteUtility.GetSQLiteTypeString(t.PropertyType) })
.ToDictionary(t => t.key, t =>
t.value);
CreateTable(name, fields);
}
and
public void PushData<T>() where T : EntityData
{
var data = _context.Set<T>().Where(p => p.Deleted == false).ToList();
}
我有超过 50 种类型需要像这样调用此方法
CreateTables<Class1>();
PushData<Class1>();
虽然我可以这样做,但我更喜欢创建类型数组并使用 for 循环来调用此方法
类似这样的东西
Type[] types=new Types[]{typeof(Class1),typeof(Class2)}
foreach(var type in types)
{
//call create table method
CreateTables<type>(); - - this doesnt work as "type" is a variable
used as a type
}
有解决办法吗?这还可以为我节省大量代码并有效地重构事物吗?
编辑1:
从答案来看,CreateTables(Type T)之类的参数确实可以,但是对于上面的第二种方法,是否也有可能?
在第二种情况下,重要的是提及类型为 EntityData 的 T,因为方法中的代码依赖于它。
最佳答案
本质上,您是在尝试从反射到泛型再回到反射。
由于所讨论的方法只是退回到反射,因此更好的方法是创建一个采用类型的重载,如下所示:
public void CreateTables<T>()
{
CreateTables(typeof(T));
}
public void CreateTables(Type tableType)
{
string name = tableType.Name;
var fields = tableType.GetProperties().Select(t => new
{
key = t.Name.ToLower(CultureInfo.InvariantCulture),
value = SqLiteUtility.GetSQLiteTypeString(t.PropertyType)
})
.ToDictionary(
t => t.key,
t => t.value);
CreateTable(name, fields);
}
这样您仍然可以使用特定类型调用它,泛型方面,或者您可以通过简单地传递类型对象从循环中调用它。
话虽如此,如果您无法更改获取Type
对象的方法,那么您需要使用反射调用它:
var m = GetType().GetMethod("CreateTables").MakeGenericMethod(new Type[] { type });
m.Invoke(this, null);
注意!这假设您只有一个这样的方法可用,它是公开的,等等。
关于c# - 通用类型作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47201646/