2016-03-04 5 views
4

Можно ли сделать такой код работать ?:Использование переменной в качестве типа

private List<Type> Models = new List<Type>() 
    { 
     typeof(LineModel), typeof(LineDirectionModel), typeof(BusStopTimeModel), typeof(BusStopNameModel) 
    }; 

    foreach (Type model in Models) // in code of my method 
    { 
     Connection.CreateTable<model>(); // error: 'model' is a variable but is used like a type 
    } 

Заранее спасибо

+0

да, но нет простого способа, как это. по соображениям производительности я предлагаю вам написать весь код для всех типов, которые вам нужны. Я думаю, что есть способ отражения, но это будет медленным и непростым. –

+1

Вам нужно будет использовать метод MakeGenericMethod. Вероятно, есть лучший способ сделать то, что вы хотите. Но да, можно. – Jonesopolis

+0

'CreateTable ' должен работать, я думаю. –

ответ

2

Вы не сможете использовать переменную в качестве общего типа, используя обычный синтаксис (CreateTable<model>). Не зная, что CreateTable делает, у вас есть два варианта:

  1. Вместо того, чтобы CreateTable общий метод, у него принимают тип в качестве параметра:

    public static void CreateTable(Type modelType) 
    { 
    } 
    
  2. Использование Reflection динамически ссылаться на общий метод с использованием нужного типа:

    var methodInfo = typeof (Connection).GetMethod("CreateTable"); 
    foreach (Type model in Models) 
    { 
        var genericMethod = methodInfo.MakeGenericMethod(model); 
        genericMethod.Invoke(null, null); // If the method is static OR 
        // genericMethod.Invoke(instanceOfConnection, null); if it's not static 
    } 
    

Обратите внимание, что путь отражения будет медленнее, так как информация метода не будет разрешена до выполнения.

+0

Точно потому, что он медленнее, вы должны переместить 'typeof (Connection) .GetMethod (« CreateTable »)' вне 'foreach' и вызывать только' MakeGenericMethod' и 'Invoke' внутри. – xanatos

+0

@xanatos Хорошая точка, пересмотрены. – PoweredByOrange

0

Вы можете сделать это так,

private List<Type> Models = new List<Type>() 
{ 
    typeof(LineModel), typeof(LineDirectionModel), typeof(BusStopTimeModel), typeof(BusStopNameModel) 
}; 

void SomeMethod() 
{ 
    MethodInfo genericFunction =Connection.GetType().GetMethod("CreateTable"); 

    foreach (Type model in Models) 
    { 
    MethodInfo realFunction = genericFunction.MakeGenericMethod(model); 
    var ret = realFunction.Invoke(Connection, new object[] { }); 
    } 
} 
Смежные вопросы