gpt4 book ai didi

基于类型的 C# 观察者?

转载 作者:行者123 更新时间:2023-11-30 15:13:12 27 4
gpt4 key购买 nike

假设我想创建一组基于类型的观察者。也就是说,当他们收到事件通知时,他们会被告知其中一个参数的类型,然后根据是否可以对该类型进行操作来决定是否采取行动。

有没有简单的方法可以做到这一点?我认为这对于泛型来说会相当简单,但事实证明这似乎比我想象的要难。如果可以避免的话,我宁愿不必处理将一堆引用转换为对象。

我遇到困难的地方在于这样做:

public delegate void NotifyDelegate<T>(IEnumerator<T> loadable, NotifyArgs na);

interface IObserver
{
void Notify<T>(IEnumerator<T> loadable, NotifyArgs na);
}

class Subject
{
NotifyDelegate notifier; //won't compile: needs type args

void Register(IObserver o)
{
notifier += o.Notify;
}
}

当然,我也可以使 Subject 通用,但是我必须为每种类型创建一个单独的 Subject。有人在这里有什么建议吗?是否有某些功能是我在某处遗漏的,或者我是否将其过于复杂化了?

更新:我确实过度简化了 Notify 和 NotifyDelegate 的参数。而不是这个:

public delegate void NotifyDelegate<T>(NotifyArgs na);

我实际上想做这样的事情:

public delegate void NotifyDelegate<T>(IEnumerator<T> loadable, NotifyArgs na);

我基本上试图来回传递的是来自数据库的数据。如果前面的代码示例让任何人感到困惑,我们深表歉意。

最佳答案

首先,将您获得的代码更改为以下内容:

interface IObserver
{
}

class Subject
{
public Subject ()
{
m_observers = new List<IObserver> ();
}

public void Register (IObserver o)
{
m_observers.Add (o);
}

List<IObserver>
m_observers;
}

然后,使用反射根据参数类型找到合适的函数:

  public void NotifyObservers (object param)
{
foreach (IObserver observer in m_observers)
{
foreach (MethodInfo method in observer.GetType ().GetMethods (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Instance))
{
if (method.Name == "Notify")
{
ParameterInfo []
parameters = method.GetParameters ();

if (parameters.Length == 1 && parameters [0].ParameterType == param.GetType ())
{
method.Invoke (observer, new object [] { param });
break;
}
}
}
}
}

并像这样使用它:

class Observer : IObserver
{
public Observer (Subject s)
{
s.Register (this);
}

void Notify (float value)
{
System.Diagnostics.Trace.WriteLine ("float value = " + value);
}

void Notify (int value)
{
System.Diagnostics.Trace.WriteLine ("int value = " + value);
}
}

static void Main (string [] args)
{
Subject
s = new Subject ();

Observer
o = new Observer (s);

float
v1 = 3.14f;

int
v2 = 42;

System.Diagnostics.Trace.WriteLine ("sending float");
s.NotifyObservers (v1);
System.Diagnostics.Trace.WriteLine ("sending int");
s.NotifyObservers (v2);
}

关于基于类型的 C# 观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/295952/

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