将对象转换为泛型 T
Convert object to generic T
如何通过参数传递 T 但我需要这样做:
补充:我需要为每个 SqlServerTable 对象创建一个线程,它是一个数据表,但是进入我的方法 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);
}
}
}
听起来你想动态调用泛型方法。
方法如下:
从简单类型开始:
public class Foo
{
}
还有一个class中的简单方法:
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);
您似乎想向通用方法提供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 的副本。
如何通过参数传递 T 但我需要这样做:
补充:我需要为每个 SqlServerTable 对象创建一个线程,它是一个数据表,但是进入我的方法 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);
}
}
}
听起来你想动态调用泛型方法。
方法如下:
从简单类型开始:
public class Foo
{
}
还有一个class中的简单方法:
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);
您似乎想向通用方法提供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 的副本。