gpt4 book ai didi

c# - 通用类型作为变量

转载 作者:太空狗 更新时间:2023-10-29 22:06:04 26 4
gpt4 key购买 nike

我有一个接受通用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com