在泛型上使用方法

本文关键字:使用方法 泛型 | 更新日期: 2023-09-27 18:25:53

我有很多这样的方法:

public UIPCompanyButton AddCompanyButton (string name, Company company, UIEventListener.VoidDelegate methodToCall, GameObject contents)
{
    return UIPCompanyButton.Create (name, company, methodToCall, contents);
}

我想用这样一种方法来代替:

    public T AddButton<T,K>(string name, K item, UIEventListener.VoidDelegate methodToCall, GameObject contents) where T:UIPMenuButton
{
    return T.Create(name, item, methodToCall, contents);
}

这显然在t.Create部分不起作用。我需要使用某种语法吗?

我也对具有相同结果的另一个方法持开放态度:一个方法接受派生的menuButton,并创建具有正确类"item"的正确方法。

在泛型上使用方法

不,您不能在泛型类型上调用静态方法-不能没有反射。除此之外,没有办法将泛型类型约束为具有特定的静态成员。与之最接近的是无参数构造函数约束。

您想要的是一个创建对象的工厂。下面是一个小的工作示例。这可能不是实现工厂模式的最佳方式,但它应该会让您继续前进。

有关更深入的示例和解释,请参阅本页。

public class Button {
    public string Whatever { get; set; }
    public Button() {
        Whatever = "Hello, world!";
    }
}
public interface IAddButton {
    Button CreateButton();
}
public class ClassToMakeButtonFor1 {
    public static void RegisterMe() {
        ButtonFactory.Register(typeof(ClassToMakeButtonFor1), new ButtonFactory1());
    }
}
public class ButtonFactory1 : IAddButton {
    public Button CreateButton() {
        return new Button();
    }
}
public class ClassToMakeButtonFor2 {
    public static void RegisterMe() {
        ButtonFactory.Register(typeof(ClassToMakeButtonFor2), new ButtonFactory2());
    }
}
public class ButtonFactory2 : IAddButton {
    public Button CreateButton() {
        var b = new Button { Whatever = "Goodbye!" };
        return b;
    }
}
public static class ButtonFactory {
    private static Dictionary<Type, IAddButton> FactoryMap = new Dictionary<Type, IAddButton>();
    public static void Register(Type type, IAddButton factoryClass) {
        FactoryMap[type] = factoryClass;
    }
    public static Button MakeMeAButton<T>() where T : class {
        return FactoryMap[typeof(T)].CreateButton();
    }
}
internal class Program {
    private static void Main(string[] args) {
        ClassToMakeButtonFor1.RegisterMe();
        ClassToMakeButtonFor2.RegisterMe();
        Button b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor1>();
        Console.WriteLine(b.Whatever);
        b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor2>();
        Console.WriteLine(b.Whatever);
        Console.ReadLine();
    }
}

您可以考虑使用一些接口(例如ICreator)来定义要调用的Create方法。

然后将类型参数约束为实现接口的类型(其中T:ICreator)。

然后,您将在实例上调用该方法,而不是静态方法。所以在您的情况下,也许您可以调用item。创建(…).

对你的案子有意义吗?

听起来您可以将Button类设为泛型。根据每个派生类中的逻辑量,这可能不适用于您。

class Button<T>
{
    public T Item { get; private set; }
    public Button(string name, T item, ...)
    {
        // Constructor code
    }
}
// Helper class for creation
static class Button
{
    public static Button<T> Create<T>(string name, T item, ...)
    {
        return new Button<T>(name, item, ...);
    }
}

然后,使用这个:

Button<Company> button = Button.Create("Name", company, ...);