我正在寻找一种比Activator.CreateInstance
从其类型实例化类更快的方法。
我现在正在这样做:Activator.CreateInstance(typeof(LoginView));
但它非常慢:我在实例化不同的视图时看到了一些滞后。
给我一个建议?我现在用谷歌搜索了几个小时,但我没有找到比这更快的方法来做我想做的事..:/
非常感谢 (:
我正在寻找一种比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);
和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;
}
与泛型方法相比,使用此方法的一个优点是您可以轻松地将参数传递给构造函数,但缺点是代码更冗长。
编辑看起来类型是通用的,而不仅仅是 LoginView。你可以试试这个:
public void Foo<T>(T input) where T : new()
{
var myInstance = new T();
}
不要采用 aType
来返回 的结果,而是typeof
采用一个委托来获取对象的实例:
Func<object> myActivator = () => new LoginView();
如果它可以使您的代码更容易,甚至可能有一种方法可以帮助您做到这一点:
public static Func<object> GetActivator<T>() where T : new()
{
return () => new T();
}
调用Func
委托的开销非常小。应该比调用Activator.CreateInstance
.Type
你可以使用泛型。
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);