- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 MulticastDelegate
,它可以引用具有相同签名的多个(遗留)委托(delegate)之一。例如:
public delegate void ObjectCreated(object sender, EventArgs args);
public delegate void ObjectDeleted(object sender, EventArgs args);
//...
然后使用这些委托(delegate)来定义事件:
public event ObjectCreated ObjectWasCreated;
public event ObjectDeleted ObjectWasDeleted;
然后我有一个方法接收一个 MulticastDelegate
,我用它来做一些常见的检查:
void DispatchEvent(MulticastDelegate handler, object sender, EventArgs args)
{
if (handler != null)
{
// ...
handler.DynamicInvoke(sender, args);
}
}
从定义事件的类的其他方法中调用:
DispatchEvent(ObjectWasCreated, sender, args);
DispatchEvent(ObjectWasDeleted, sender, args);
是否有更简洁的方法来避免 DynamicInvoke?
最佳答案
这是我的无反射解决方案。它基本上将多播委托(delegate)实现为列表。更少的代码?不,更好的表现?我不知道。清洁工?嗯。
public delegate void ObjectCreated(object sender, EventArgs args);
public delegate void ObjectDeleted(object sender, EventArgs args);
public event ObjectCreated ObjectWasCreated
{
add
{
m_ObjectCreatedSubscribers.Add(value.Invoke);
}
remove
{
m_ObjectCreatedSubscribers.RemoveAll(e => e.Target.Equals(value));
}
}
public event ObjectDeleted ObjectWasDeleted
{
add
{
m_ObjectDeletedSubscribers.Add(value.Invoke);
}
remove
{
m_ObjectDeletedSubscribers.RemoveAll(e => e.Target.Equals(value));
}
}
private List<Action<object, EventArgs>> m_ObjectCreatedSubscribers = new List<Action<object, EventArgs>>();
private List<Action<object, EventArgs>> m_ObjectDeletedSubscribers = new List<Action<object, EventArgs>>();
void DispatchEvent(List<Action<object, EventArgs>> subscribers, object sender, EventArgs args)
{
foreach (var subscriber in subscribers)
subscriber(sender, args);
}
关于c# - 使用 MulticastDelegate 作为参数同时避免 DynamicInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751799/
我继承了一些我想在这里理解的主要意大利面条代码(组合 C#/VB)。 这似乎是一个非常奇怪的情况,其中有两个连续调用来触发远程对象的事件,这是通过调用委托(delegate)的 DynamicInvo
我正在使用以下方式调用委托(delegate)(动态可配置服务): public void CallService (Delegate service, IContext ctx) { var
我想通过存储在列表中的方法名称来调用方法。谁能帮忙?我是 c# 新手! { delegate string ConvertsIntToString(int i); } class Program
我在运行时使用表达式树构建委托(delegate): Type type = GetType(); ParameterExpression parameterType = Expression.Par
我有一个 MulticastDelegate,它可以引用具有相同签名的多个(遗留)委托(delegate)之一。例如: public delegate void ObjectCreated(objec
我有一个 MethodCallExpression 包含这样的日期调用 DateTime.UtcNow.AddDays(-10); 我希望能够将其编译成它所代表的实际日期,但由于我使用的是 Xamar
这个问题部分是关于委托(delegate)的,部分是关于泛型的。 给定简化代码: internal sealed class TypeDispatchProcessor { private r
目前我使用的是非常慢的DynamicInvoke。仍在使用 Delegate 类型如何在没有后期绑定(bind)/DynamicInvoke 的情况下直接调用 Delegate? Delegate _
我读到我应该创建和重用委托(delegate)来获取对象属性的值。 我使用这段代码来创建委托(delegate) var objParm = Expression.Parameter(prop
我在基类中有以下代码: public static void InvokeExternal(Delegate d, object param, object sender) { if (d !
我正在努力创建对私有(private)的调用 ImmutableDictionary.Add ,这让我可以利用 KeyCollisionBehavior为了更好地控制(Add 方法仅在键和值不同时抛出
DynamicInvoke 和 DynamicInvokeImpl 的文档说: Dynamically invokes (late-bound) the method represented by t
为什么这行不通? namespace InvokeTest { public class MethodInvoker { public static void Exec
是否可以动态地创建方法的委托(delegate)来柯里化(Currying)一些参数(并且不需要表达式的编译和 DynamicInvoke)? 使用 DynamicInvoke 调用柯里化(Curry
我有一个类(class),用户。 Users 有一个 UserId 属性。 我有一个看起来像这样的方法: static IQueryable FilterById(this IQueryable p,
假设我有一个名为 Poll 的表,我想编写一个 LINQ 扩展来列出 ID 属于一个数组的所有民意调查。例如: void Main() { long[] ids = new long[]{ 1
为什么... Func> table = () => CampaignCodePaths; Func propertySelector = e => e.Id; int key = 1; Func w
我是一名优秀的程序员,十分优秀!