我想创建一个通用机制来处理C#中的消息.我在我的小应用程序中需要这个,所以我不想使用完整的消息总线.我的要求很简单:
Message1,Message2.他们可以从一个基类继承,这不是问题,但如果不是,我不在乎.目前他们确实继承了Message.能够为每个消息类获取处理程序.即如果我发送Message1,那么Message1Handler应该实例化类.处理程序必须实现IMessageHandler<T>,其中T是消息类.IMessageHandler定义如下:
interface IMessageHandler<T>
{
void Execute(T message);
}
Run Code Online (Sandbox Code Playgroud)我写了一个简单的"解析器"类:
public static class HandlerRegistry
{
private static readonly Dictionary<string, Type> _handlers = new Dictionary<string, Type>();
public static void Register<T, T2>() where T2: IMessageHandler<T>
{
_handlers.Add(typeof(T).FullName, typeof(T2));
}
public static IMessageHandler<T> Resolve<T>(T parameters)
{
var type = _handlers[parameters.GetType().FullName];
return (IMessageHandler<T>) Activator.CreateInstance(type);
}
}
Run Code Online (Sandbox Code Playgroud)
在这个实现中,一切都很好,但是一部分 - 转换为IMessageHandler.当我试图将它与消息集合一起使用时,会发生这样的情况:编译器在编译时不知道集合中将会有什么实际消息 - 它只是假设它们都是子类Message,所以它是试图投射IMessageHandler<ConcreteMessage>到IMessageHandler<Message>显然我得到一个无效演员的异常.在这种情况下,可能的逆变会有所帮助,但我无法将参数声明为out,因为我在Execute方法参数中有消息. …
设计问题 - 多态事件处理
我目前正在尝试减少当前项目中的事件句柄数量.我们有多个通过USB发送数据的系统.我目前有一个例程来读取消息并解析初始标头详细信息以确定消息来自哪个系统.标题稍有不同,所以我创建的EventArgs不一样.然后我通知所有"观察员"这一变化.所以我现在所拥有的是以下内容:
public enum Sub1Enums : byte
{
ID1 = 0x01,
ID2 = 0x02
}
public enum Sub2Enums : ushort
{
ID1 = 0xFFFE,
ID2 = 0xFFFF
}
public class MyEvent1Args
{
public Sub1Enums MessageID;
public byte[] Data;
public MyEvent1Args(Sub1Enums sub1Enum, byte[] data)
{
MessageID = sub1Enum;
Data = data;
}
}
public class MyEvent2Args
{
public Sub2Enums MessageID;
public byte[] Data;
public MyEvent2Args(Sub2Enums sub2Enum, byte[] data)
{
MessageID = sub2Enum;
Data = data;
}
}
Run Code Online (Sandbox Code Playgroud)
Form1代码
public …Run Code Online (Sandbox Code Playgroud) 我在应用程序中有一个要处理的不同作业列表.我正在使用一种使用不同类型来表示不同类型作业的设计 - 这很自然,因为它们具有不同的属性等等.对于处理,我正在考虑根据下面的代码在C#中使用dynamic关键字.
abstract class Animal {}
class Cat : Animal {}
class Dog : Animal {}
class AnimalProcessor
{
public void Process(Cat cat)
{
System.Diagnostics.Debug.WriteLine("Do Cat thing");
}
public void Process(Dog dog)
{
System.Diagnostics.Debug.WriteLine("Do Dog thing");
}
public void Process(Animal animal)
{
throw new NotSupportedException(String.Format("'{0}' is type '{1}' which isn't supported.",
animal,
animal.GetType()));
}
}
internal class Program
{
private static void Main(string[] args)
{
List<Animal> animals = new List<Animal>
{
new Cat(),
new Cat(),
new Dog(),
new Cat() …Run Code Online (Sandbox Code Playgroud)