Как создать этот конкретный универсальный метод? - PullRequest
1 голос
/ 06 июля 2011

У меня есть таблица (мой собственный не DataTable), который хранит коллекцию

   KeyValuePairs<string,Type> [] columns ;

, теперь значение типа помогает мне в моем приложении.например, когда мне нужно создать «индекс БД» (дерево B +)

, мне требуется тип поля с ключом (его типа)

Что теперьЯ пытаюсь сделать, это создать универсальный метод, который будет возвращать этот индекс, получая имя поля и таблицы, из которой оно получено.

Дерево, ссылающееся на метод, не знает, какой тип будет иметь поле моей попытки, было следующим:

метод:

 public BTree<T,object> CreateIndex<T>(string path,string FieldName) where T : IComparable

в основном (или гдекогда-либо):

   Type index_type = table.Columns[2].Value;// the type
   string field = table.Columns[2].Key; // the name of the field
   BTree< 'type goes here',object> tree = CreateIndex<'type goes here'>(csv_path,field_name);  

Я не смог найти способ извлечь тип ...

Я подумал, если поставить его как свой собственный index_type, объект тоже сделает свою работу.попытался привести тип threw

         Type.GetType(index_type.Name)
         Type.GetType(index_type.FullName)
         Type.GetType(index_type)
         Type.GetType(index_type.GetType())

          index_type.GetType() by itself 

, но, похоже, не смог получить его, кроме как тип.если я, конечно, даю шрифт, все работает нормально.

     BTree<float,object> tree = reader.CreateIndex<float>(csv, field); 

Ответы [ 2 ]

1 голос
/ 06 июля 2011
// 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});

    }

}
0 голосов
/ 06 июля 2011

Чуть короче, чем умный пещерный человек будет

Activator.CreateInstance(typeof(BTree<>).MakeGenericType(indextype, typeof(object)), new object[]{arguments to constructor})

но для него требуется класс и конструктор по умолчанию

...