用类的类型实例化类

本文关键字:实例化 类型 | 更新日期: 2023-09-27 18:24:41

我正在寻找一种比Activator.CreateInstance更快的方法来从类的类型实例化类。

我现在是这样做的:Activator.CreateInstance(typeof(LoginView));,但速度非常慢:在实例化不同的视图时,我看到了一些滞后。

给我一个建议?我在谷歌上搜索了好几个小时,我没有找到比这更快的方法来做我想做的事

非常感谢(:

用类的类型实例化类

您可以使用Linq表达式,如本文所述。在你的情况下,它将是

ConstructorInfo ctor = typeof(LoginView).GetConstructors().First();
ObjectActivator<LoginView> createdActivator = GetActivator<LoginView>(ctor);

LoginView instance = createdActivator();

如果链接断开,这是ObjectActivator代表

delegate T ObjectActivator<T>(params object[] args);

和CCD_ 4方法

public static ObjectActivator<T> GetActivator<T>
    (ConstructorInfo ctor)
{
    Type type = ctor.DeclaringType;
    ParameterInfo[] paramsInfo = ctor.GetParameters();                  
    //create a single param of type object[]
    ParameterExpression param =
        Expression.Parameter(typeof(object[]), "args");
    Expression[] argsExp =
        new Expression[paramsInfo.Length];            
    //pick each arg from the params array 
    //and create a typed expression of them
    for (int i = 0; i < paramsInfo.Length; i++)
    {
        Expression index = Expression.Constant(i);
        Type paramType = paramsInfo[i].ParameterType;              
        Expression paramAccessorExp =
            Expression.ArrayIndex(param, index);              
        Expression paramCastExp =
            Expression.Convert (paramAccessorExp, paramType);              
        argsExp[i] = paramCastExp;
    }                  
    //make a NewExpression that calls the
    //ctor with the args we just created
    NewExpression newExp = Expression.New(ctor,argsExp);                  
    //create a lambda with the New
    //Expression as body and our param object[] as arg
    LambdaExpression lambda =
        Expression.Lambda(typeof(ObjectActivator<T>), newExp, param);              
    //compile it
    ObjectActivator<T> compiled = (ObjectActivator<T>)lambda.Compile();
    return compiled;
}

与泛型方法相比,使用此方法的一个优点是可以轻松地将参数传递给构造函数,但缺点是代码更详细。

您可以使用泛型。

T MyActivator<T>() where T : new() { return new T(); }
T MyActivator<T>(T variable) where T : new() { return new T(); }

如果您知道类型(明确使用类型),则使用第一个
第二个用于从变量推断类型:

MyType blah = MyActivator<MyType>();
SomeType someVar;
object blah = MyActivator(someVar);

EDIT似乎该类型是通用的,而不仅仅是LoginView。你可以试试这个:

public void Foo<T>(T input) where T : new()
{
    var myInstance = new T();
}

不要使用返回typeof结果的Type,而是使用一个为您获取对象实例的委托:

Func<object> myActivator = () => new LoginView();

也许甚至有一种方法可以帮助你做到这一点,如果它能让你的代码更容易的话:

public static Func<object> GetActivator<T>() where T : new()
{
    return () => new T();
}

这将使调用Func委托的开销非常小。应该比在Type上调用Activator.CreateInstance快得多。