c#-如何创建这个特定的泛型方法?

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

我有一个table(我自己的而不是DataTable)类,它包含

   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})