【发布时间】:2018-04-22 10:26:42
【问题描述】:
我有一个接受通用 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) 这样的参数确实可以工作,但是对于上面的第二种方法,是否也有可能?
在第二个中,重要的是提到 T 类型为 EntityData,因为方法中的代码依赖于它。
【问题讨论】:
-
这些类有什么共同点可以让您使用反射找到它们吗?
-
当您踏入反思的世界时,您通常无法轻易退出。要一般调用该方法,您必须使用反射来调用它。
-
所以写
CreateTables(Type),让CreateTables<T>打电话给CreateTables(typeof(T))。您根本没有使用T在编译时可用这一事实,因此您不会失去任何表现力。 -
@TimothyGroote 他们都继承自同一个类。
-
现在这个人有什么问题,问 7-10 岁的问题,每个人都喜欢:“哦,让我回答并获得投票,我什至不会搜索问题是否有答案。” ?
标签: c#