相关疑难解决方法(0)

Delegate.CreateDelegate与DynamicMethod vs Expression

关于使反思飞行和探索代表的问题 ......

如果我需要为Func<T, TResult>动态加载类型的方法创建委托,我可能会使用(1)Delegate.CreateDelegate(2)DynamicMethod(3)Expression树.

让我们说一组动态加载的类型/方法在应用程序启动时通过config反映一次,并在应用程序的整个生命周期中使用(启动性能不是问题,也不是内存),代理被缓存并分派到一个强烈的方式.这些代理是同时访问的热路径.

您更喜欢哪种动态绑定方法?为什么?

.net c# reflection delegates dynamic

23
推荐指数
2
解决办法
1万
查看次数

具有未知类型的CreateDelegate

我正在尝试创建Delegate,用于在运行时读取/写入未知类型类的属性.

我有一个泛型类Main<T>和一个如下所示的方法:

Delegate.CreateDelegate(typeof(Func<T, object>), get)
Run Code Online (Sandbox Code Playgroud)

哪个getMethodInfo应该阅读的属性.问题是当属性返回时int(我猜这种情况发生在值类型中),上面的代码抛出了ArgumentException,因为该方法无法绑定.在字符串的情况下,它运作良好.

为了解决这个问题,我更改了代码,以便使用生成相应的Delegate类型MakeGenericType.所以现在的代码是:

Type func = typeof(Func<,>);
Type generic = func.MakeGenericType(typeof(T), get.ReturnType);
var result = Delegate.CreateDelegate(generic, get)
Run Code Online (Sandbox Code Playgroud)

现在的问题是generic我必须使用创建的委托实例,DynamicInvoke这与使用纯反射来读取字段一样慢.

所以我的问题是为什么第一段代码失败了值类型.根据MSDN,它应该像它说的那样工作

如果方法的返回类型比委托的返回类型更具限制性,则委托的返回类型与方法的返回类型兼容

以及如何在第二个片段中执行委托,以便它比反射更快.

谢谢.

.net c# generics reflection delegates

11
推荐指数
1
解决办法
8739
查看次数

C#方法能够处理/接受不同的类类型

我有一个方法接受一个简单的类对象,并构建一个API调用中使用的URL.我希望这个方法能够处理/接受相似但具有不同属性的不同类类型.

public class ClientData
{
   public string Name {get; set;}
   public string Email {get; set;}
   ...
}

public class PaymentData
{
   public decimal PaymentAmount {get; set;}
   public string Description {get; set;}
   ...
}
Run Code Online (Sandbox Code Playgroud)

以下是两个示例方法.如你所见,它们非常相似.最好是将这些实现为接受不同参数的不同方法,还是可以编写一个可以处理参数对象差异的方法?

public string BuildApiCall(ClientData clientDataObject)
{
  StringBuilder sb = new StringBuilder();
  sb.Append("http://mytestapi.com/");
  sb.append("name=" + clientDataObject.Name);
  sb.append("email=" + clientDataObject.Email);
  return sb.ToString();
}

public string BuildApiCall(PaymentData paymentDataObject)
{
  StringBuilder sb = new StringBuilder();
  sb.Append("http://mytestapi.com/");
  sb.append("payment=" + paymentDataObject.PaymentAmount );
  sb.append("description=" + paymentDataObject.Description );
  return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

c#

4
推荐指数
1
解决办法
214
查看次数

标签 统计

c# ×3

.net ×2

delegates ×2

reflection ×2

dynamic ×1

generics ×1