0

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

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

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

非常感谢 (:

4

4 回答 4

4

您可以按照此博客文章中的说明使用 Linq 表达式。在你的情况下,这将是

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


LoginView instance = createdActivator();

如果链接断开,这是ObjectActivator委托

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

GetActivator方法

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

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

于 2013-07-24T19:45:31.643 回答
1

编辑看起来类型是通用的,而不仅仅是 LoginView。你可以试试这个:

public void Foo<T>(T input) where T : new()
{
    var myInstance = new T();
}
于 2013-07-24T19:43:49.717 回答
1

不要采用 aType来返回 的结果,而是typeof采用一个委托来获取对象的实例:

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

如果它可以使您的代码更容易,甚至可能有一种方法可以帮助您做到这一点:

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

调用Func委托的开销非常小。应该比调用Activator.CreateInstance.Type

于 2013-07-24T19:52:17.947 回答
1

你可以使用泛型。

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);
于 2013-07-24T19:46:12.030 回答