2014-01-17 4 views
0

Я имею в виду по ссылке ниже:Создание объекта с помощью лямбда-выражения на основе имени класса

http://rogeralsing.com/2008/02/28/linq-expressions-creating-objects/ 

Можно ли улучшить его, чтобы создать объект, указав имя класса? основном добиться того, что Activator.CreateInstance может сделать ниже с помощью лямбда-выражения

Dim typeName As String = "Testing.ClassNameth, Testing" 
Dim typ As Type = Type.GetType(typeName) 
Dim testObj = Activator.CreateInstance(typ) 
Dim methodInfo As MethodInfo = testObj.GetType().GetMethod("TestPrintObject") 

Цель, почему я делаю это потому, что производительность Activator.CreateInstance является довольно медленным.

Спасибо!

ответ

0

Хорошо. После нескольких исследований, ниже ответ: Добавить функции ниже любого из вашего соответствующего класса:

Public Function GetActivator(Of T)(type As Type) As ObjectActivator(Of T) 
    'make a NewExpression that calls the 
    'ctor with the args we just created 
    Dim newExp As NewExpression = Expression.[New](type) 

    'create a lambda with the New 
    'Expression as body 
    Dim lambda As LambdaExpression = Expression.Lambda(GetType(ObjectActivator(Of T)), newExp) 

    'compile it 
    Dim compiled As ObjectActivator(Of T) = DirectCast(lambda.Compile(), ObjectActivator(Of T)) 
    Return compiled 
End Function 

Public Delegate Function ObjectActivator(Of T)() As T 

Тогда мы можем вызвать функцию выше, как:

Dim typeName As String = "Testing.ClassNameth, Testing" 
Dim typ As Type = Type.GetType(typeName) 
Dim testObj As Object = YourHelperClassInstance.GetActivator(Of Object)(typ).Invoke() 

Надежда этот пост поможет кому-то в будущем.

Спасибо!

Смежные вопросы