gpt4 book ai didi

c# - Activator.CreateInstance() 和 typeof(T).InvokeMember() 与 BindingFlags.CreateInstance 之间的区别

转载 作者:可可西里 更新时间:2023-11-01 07:57:18 27 4
gpt4 key购买 nike

如果这个问题已经被问过和回答过,请原谅我。

给定一个类型为 T 的类,下面的区别是什么?

T myObj = Activator.CreateInstance<T>();

T myObj = typeof(T).InvokeMember(null, BindingFlags.CreateInstance, null, null, null);

一种解决方案优于另一种解决方案吗?

最佳答案

反编译RuntimeType.InvokeMember产生这个片段:

if ((bindingFlags & BindingFlags.CreateInstance) != BindingFlags.Default)
{
if (((bindingFlags & BindingFlags.CreateInstance) != BindingFlags.Default) && ((bindingFlags & (BindingFlags.SetProperty | BindingFlags.GetProperty | BindingFlags.SetField | BindingFlags.GetField | BindingFlags.InvokeMethod)) != BindingFlags.Default))
{
throw new ArgumentException(Environment.GetResourceString("Arg_CreatInstAccess"), "bindingFlags");
}
return Activator.CreateInstance(this, bindingFlags, binder, providedArgs, culture);
}

换句话说,InvokeMember与那些BindingFlags电话 Activator.CreateInstance .在开始工作之前,它还要经过几个调用层(检查绑定(bind)、验证参数)。 Activator.CreateInstance<T>更简洁:

public static T CreateInstance<T>()
{
bool bNeedSecurityCheck = true;
bool canBeCached = false;
RuntimeMethodHandle emptyHandle = RuntimeMethodHandle.EmptyHandle;
return (T) RuntimeTypeHandle.CreateInstance(typeof(T) as RuntimeType, true, true, ref canBeCached, ref emptyHandle, ref bNeedSecurityCheck);
}

EDITED 您可能希望后者更快,但是一个名为 RuntimeType.CreateInstanceSlow 的方法也叫 RuntimeTypeHandle.CreateInstance做工作;如果找不到构造函数的 Activator 缓存条目,它将用作回退。如果您正在寻找两者中最快的解决方案,我会进行一些性能测试。

关于c# - Activator.CreateInstance() 和 typeof(T).InvokeMember() 与 BindingFlags.CreateInstance 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1295344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com