C#泛型/通用类型

本文关键字:类型 泛型 | 更新日期: 2023-09-27 18:00:52

static Dictionary<Type, Action<object>> handlers;
public static void Main (string[] args)
{
    handlers = new Dictionary<Type, Action<object>>();
    AddHandler<One>((object rawOne) => { One one = (One)rawOne; Console.WriteLine(one.Data); });
    AddHandler<Two>((object rawTwo) => { Two two = (Two)rawTwo; Console.WriteLine(two.Data); });
    Handle(new One("Test"));
    Handle(new Two(123));
}
public static void AddHandler<T>(Action<object> handler)
{
    handlers[typeof(T)] = handler;
}
public static void Handle(object data)
{
    handlers[data.GetType()].Invoke(data);
}

因为没有更好的方式来表达这一点:我该如何以一种不必铸造rawOne和rawTwo的方式来制作这个?

基本上,我想要这个:

AddHandler<One>((object rawOne) => { One one = (One)rawOne; 
Console.WriteLine(one.Data); });

看起来像这样:

AddHandler<One>((One one) => { Console.WriteLine(one.Data); };

但是,我不知道如何做到这一点。很明显,我必须以某种方式修改词典,但我不知道如何修改。

C#泛型/通用类型

像这样:

public static void AddHandler<T>(Action<T> handler)
{
    handlers[typeof(T)] = o => handler((T)o);
}

此外,由于编译器可以推断出关于您的类型的某些信息,您可以这样说:

AddHandler((One one) => { Console.WriteLine(one.Data); };

或者这个:

AddHandler<One>(one => { Console.WriteLine(one.Data); };