c#-如何创建这个特定的泛型方法?
我有一个table(我自己的而不是DataTable)类,它包含c#-如何创建这个特定的泛型方法?,c#,generics,type-conversion,C#,Generics,Type Conversion,我有一个table(我自己的而不是DataTable)类,它包含 KeyValuePairs<string,Type> [] columns ; 但除了作为一种类型,它似乎无法实现。 当然,如果我给类型,每件事都很好 BTree<float,object> tree = reader.CreateIndex<float>(csv, field); BTree-tree=reader.CreateIndex(csv,字段); //包含Cre
KeyValuePairs<string,Type> [] columns ;
但除了作为一种类型,它似乎无法实现。
当然,如果我给类型,每件事都很好
BTree<float,object> tree = reader.CreateIndex<float>(csv, field);
BTree-tree=reader.CreateIndex(csv,字段);
//包含CreateIndex方法的类。请注意,如果此方法是静态的,则必须更改BindingFlags
公共类索引器
{
//你的方法
公共BTree CreateIndex(字符串路径、字符串字段名)
其中T:i可比较
{
//方法体
}
//通用方法
公共对象CreateIndex(类型indexType、字符串路径、字符串字段名)
{
var genericMethod=GetType()
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Single(methodInfo=>methodInfo.Name==“CreateIndex”&&methodInfo.IsGenericMethodDefinition)
.MakeGenericMethod(indexType);
返回genericMethod.Invoke(这个,新对象[]{path,fieldName});
}
}
//包含CreateIndex方法的类。请注意,如果此方法是静态的,则必须更改BindingFlags
公共类索引器
{
//你的方法
公共BTree CreateIndex(字符串路径、字符串字段名)
其中T:i可比较
{
//方法体
}
//通用方法
公共对象CreateIndex(类型indexType、字符串路径、字符串字段名)
{
var genericMethod=GetType()
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Single(methodInfo=>methodInfo.Name==“CreateIndex”&&methodInfo.IsGenericMethodDefinition)
.MakeGenericMethod(indexType);
返回genericMethod.Invoke(这个,新对象[]{path,fieldName});
}
}
比聪明的穴居人要矮一点
Activator.CreateInstance(typeof(BTree<>).MakeGenericType(indextype, typeof(object)), new object[]{arguments to constructor})
Activator.CreateInstance(typeof(BTree).MakeGenericType(indextype,typeof(object)),新对象[]{构造函数的参数})
但它确实需要一个类和一个默认构造函数,比smartcaveman要短一点
Activator.CreateInstance(typeof(BTree<>).MakeGenericType(indextype, typeof(object)), new object[]{arguments to constructor})
Activator.CreateInstance(typeof(BTree).MakeGenericType(indextype,typeof(object)),新对象[]{构造函数的参数})
但是它确实需要一个类和一个默认构造函数您可能会发现这很有帮助,它展示了如何使用反射来获取几乎相同问题的类型。您可能会发现这很有帮助,它展示了如何使用反射来获取几乎相同问题的类型。
BTree<float,object> tree = reader.CreateIndex<float>(csv, field);
// the class that contains the CreateIndex<T> method. Note that you will have to change the BindingFlags if this method is static
public class IndexCreator
{
// your method
public BTree<T, object> CreateIndex<T>(string path, string fieldName)
where T : IComparable
{
// method body
}
// generic method
public object CreateIndex(Type indexType, string path, string fieldName)
{
var genericMethod = GetType()
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Single(methodInfo => methodInfo.Name == "CreateIndex" && methodInfo.IsGenericMethodDefinition)
.MakeGenericMethod(indexType);
return genericMethod.Invoke(this, new object[]{path, fieldName});
}
}
Activator.CreateInstance(typeof(BTree<>).MakeGenericType(indextype, typeof(object)), new object[]{arguments to constructor})