gpt4 book ai didi

c# - 使用已编译的 Lambda 表达式而不是 Activator.CreateInstance 来初始化 SoapHttpClientProtocol 对象

转载 作者:太空狗 更新时间:2023-10-29 21:51:17 27 4
gpt4 key购买 nike

我正在使用动态实例化 SoapHttpClientProtocol 的代码对象(代理类)并使用该对象调用 WS-Basic I Web 服务。这是我的代码的简化版本:

public override object Call(Type callingObject,
string method, object[] methodParams, string URL)
{
MethodInfo requestMethod = callingObject.GetMethod(method);

//creates an instance of SoapHttpClientProtocol
object instance = Activator.CreateInstance(callingObject);

//sets the URL for the object that was just created
instance.GetType().InvokeMember("Url",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty, null,
instance,
new object[1] {URL});

return requestMethod.Invoke(instance, methodParams);
}

我注意到在某些情况下 Activator.CreateInstance()调用可能会花费大量时间,因此我正在尝试优化代码 by using a lambda expression :

public override object Call(Type callingObject,
string method, object[] methodParams, string URL)
{
MethodInfo requestMethod = callingObject.GetMethod(method);

//creates an instance of SoapHttpClientProtocol using compiled Lambda Expression
ConstructorInfo constructorInfo = callingObject.GetConstructor(new Type[0]);
object instance = Expression.Lambda(Expression.New(constructorInfo)).Compile();

//sets the URL for the object that was just created
instance.GetType().InvokeMember("Url",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty, null,
instance,
new object[1] {URL});

//calls the web service
return requestMethod.Invoke(instance, methodParams);
}

不幸的是,这段代码没有创建 callingObject 的对象。类型(而是返回一个 Func<T> 委托(delegate)对象),因此当它尝试设置 Url 时在下一行它抛出一个异常:

System.MissingMethodException: Attempted to access a missing member.

我的代码中是否遗漏了什么?

谢谢!

最佳答案

Expression.Lambda(Expression.New(constructorInfo)).Compile()部分返回 Func<T>包装 Type 的构造函数的委托(delegate)存储在 callingObject范围。要实际调用该构造函数,您仍然需要调用它:

Delegate delegateWithConstructor = Expression.Lambda(Expression.New(constructorInfo)).Compile();
object instance = delegateWithConstructor.DynamicInvoke();

但是,从长远来看,您尝试做的事情看起来非常奇怪和脆弱,因为您将方法名称作为简单的字符串传递,将参数作为对象传递,因此会丢失所有编译时类型检查。为什么需要这样做?

关于c# - 使用已编译的 Lambda 表达式而不是 Activator.CreateInstance 来初始化 SoapHttpClientProtocol 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675097/

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