【发布时间】:2026-01-04 18:25:02
【问题描述】:
考虑这段代码:
public class Person
{
public string Name { get; set; }
}
public class Animal
{
public string Name { get; set; }
}
public interface IHandler<T>
{
T Handle(T eventData);
}
public class UpdatePersonHandler : IHandler<Person>
{
public Person Handle(Person eventData)
{
var test = eventData.Name;
return eventData;
}
}
public class UpdatePersonHandler2 : IHandler<Person>
{
public Person Handle(Person eventData)
{
var test = eventData.Name;
return eventData;
}
}
public class UpdateAnimalHandler : IHandler<Animal>
{
public Animal Handle(Animal eventData)
{
var test = eventData.Name;
return eventData;
}
}
public class Bus<T>
{
public static readonly IList<IHandler<T>> Handlers = new List<IHandler<T>>();
public static void Register(IHandler<T> handler)
{
if (handler != null)
Handlers.Add(handler);
}
public static void Raise(T eventData)
{
foreach (var handler in Handlers)
{
handler.Handle(eventData);
}
}
}
还有这个测试代码:
[TestMethod]
public void TestRegister()
{
Bus<Person>.Register(new UpdatePersonHandler());
Bus<Person>.Register(new UpdatePersonHandler());
Bus<Person>.Register(new UpdatePersonHandler2());
Bus<Animal>.Register(new UpdateAnimalHandler());
Debug.Print(Bus<Person>.Handlers.Count.ToString());
Debug.Print(Bus<Animal>.Handlers.Count.ToString());
}
这个测试的输出是:
3
1
这里发生了什么?
看起来框架正在为通过static Register 方法呈现给它的每种类型新建一个总线类。为此,它必须为每个新类型调用Bus<T> 上的默认构造函数。
但是为什么呢?这是如何工作的?
这是否有任何实际用途,或者仅仅是在生产代码中应该避免的对 C# 的有趣但晦涩的好奇心?
【问题讨论】:
标签: c# generics static static-methods