用类的类型实例化类
本文关键字:实例化 类型 | 更新日期: 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
快得多。