c# - 通用类型作为变量

标签 c#

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

相关文章:

c# - 列表字典 (C#)

c# - 无法在 memcached 中存储复杂对象

c# - DirectoryEntry() 在 .NET 4.0 中有效,但在 .NET 3.5 中无效?

c# - UWP MediaPlayerElement - 如何循环/重复 mp4

c# - ASP.NET MVC + 填充下拉列表

c# - MVVM以及保留显示的字段/属性的位置

c# - 如果给定的 int 是 2 C# 的指数,则返回

c# - 在关闭表格之前进行检查吗?

c# - 在 try block 中尝试 catch - 异常应该调用相同的函数

c# - 深入查找或搜索 JSON 中任何级别的键并替换其在 C# 中的值