将对象转换为通用T

时间:2015-05-05 01:51:49

标签: c# generics generic-handler

如何通过参数传递T,但我需要做类似的事情:

补充:我需要为每个 SqlServerTable 对象创建一个线程,它是一个Datatable,但是我的方法 CheckChanges 我的数据表被转换为继承自我的对象的 IHasId

>     class Account: IHasId<int>
>     class Requisition: IHasId<int>
>     class EtcEtc: IHasId<int>

我需要通过参数传递这些类,例如:tableItem.TableType

以下我传递了 T ,当我调用方法时我无法传递T,因为它来自对象参数dinamically

public static void Start()
{
    SqlServerTables.ForEach(tableItem =>
    {
        T t = (T)tableItem.TableType; // <- THIS IS WHAT I NEED WORKING.. :(
        var destinationTable = SqlServerDb.LoadDestination(tableItem.Table.TableName, tableItem.Table.PrimaryKey[0].ColumnName, false);
        // HOW CAN I GET THE <T> below?
        var thread = new Thread(() => SincronizeTable<T>(destinationTable)) { Name = tableItem.Table.TableName };
        thread.Start();
    });
}

private static void SincronizeTable<T>(DataTable sqlServerTable)
{
    var tableName = sqlServerTable.TableName;
    var primaryKey = sqlServerTable.PrimaryKey[0].ColumnName;

    while (_isAlive)
    {
        var sourceTable = TaskDb.LoadDataFromTask(tableName, primaryKey, true, false);
        var destinationTable = SqlServerDb.LoadDestination(tableName, primaryKey, false);

        var differences = Migration.CheckChanges<T>(sourceTable, destinationTable, false, primaryKey);

        // Save changes
        var success = Migration.SaveChanges(differences, tableName, primaryKey, Program.ArgumentParams.BatchUpdateQuantity);

        Thread.Sleep(1000);
    }
}
}

2 个答案:

答案 0 :(得分:2)

听起来你想动态调用泛型方法。

以下是:

从简单类型开始:

public class Foo
{
}

一个类中的简单方法:

public class Bar
{
    public void DoSomething<T>()
    {
        Console.WriteLine(typeof(T).FullName);
    }
}

然后你可以这样称呼它:

Foo foo = new Foo();

Type type = foo.GetType();

Bar bar = new Bar();

bar
    .GetType()
    .GetMethod("DoSomething")
    .MakeGenericMethod(type)
    .Invoke(bar, null);

答案 1 :(得分:1)

您似乎想要提供T 到通用方法。

public void MyMethod<T>(Class1 myClass)
{
}

您可以通过传递类型来派生它,而不是要求类型声明。

public void MyMethod<T>(Class1 myClass, T someClass)
{
}

如果具有类型而不是该类型的实例,那么这是Calling generic method with a type argument known only at execution time的副本。