【问题标题】:Passing an unknown class as a parameter (C#)将未知类作为参数传递(C#)
【发布时间】:2012-07-27 08:19:06
【问题描述】:

我编写了一个类来检测我的 UI 上的按钮按下,但它什么也不做。当代码运行时,我编写的 UI 管理器类会查找按钮并将它们存储在一个列表中。

我的问题是我希望不同的按钮具有不同的功能,但都可以从同一个 UI 管理器中执行。我有一个名为“按钮信息”的第三个类,我想保存对按钮函数类的引用,但我不知道该怎么做。

基本上,我希望按钮类是这样的:

using System.Collections;
using System.Collections.Generic;

public class ButtonInfo
{
    public int States;
    public int CurrentState;
    public int Animations;
    public void ButtonFunction<T>(); <--- This is the issue!
}

这是在 Unity Engine 中,所以不能使用 C# 的最新功能,但我相信这一定是可能的。

我希望上面类中的“ButtonFunction”能够携带任何类而不是具体的。

有可能吗?

干杯,

C.

【问题讨论】:

  • 你能把T替换为所有按钮中的通用基类还是object?我犹豫是否将此作为答案发布,因为我不确定它是否特定于 Unity。
  • 你能用一个接口对象列表代替泛型吗?然后,您要调用的每个类都可以实现此接口,然后可以将其存储在列表中,并在需要时使用已定义的签名进行调用。

标签: c# list generics delegates unity3d


【解决方案1】:

不确定 Unity3d 是否支持此功能(目前无法测试),但您尝试过吗?

public class ButtonInfo<T>
{
    public Action<T> ButtonFunction;
}

或者,如果不支持Action&lt;T&gt;,请尝试使用普通委托:

public class ButtonInfo<T>
{
    public delegate void ButtonHandler(T param);
    public ButtonHandler ButtonFunction;
}

然后您可以像这样分配 ButtonFunction(此处应支持 Lambda 表达式):

var x = new ButtonInfo<string>();
x.ButtonFunction += s => { Debug.Log(s); };

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2021-09-07
    • 1970-01-01
    • 2016-06-27
    • 2020-09-13
    相关资源
    最近更新 更多