在C#中,我们可以在不触及它的情况下将方法添加到公共Behavior类中吗?

时间:2012-10-02 12:21:18

标签: c# behavior

Unity csharp 中,我想制作一个GetOrAddComponent方法,这将简化相应的GetComponentAddComponent(我认为没有充分的理由)

通常的方法是:

// this is just for illustrating a context
using UnityEngine;
class whatever : MonoBehavior {
public Transform child;
void whateverMethod () {

    BoxCollider boxCollider = child.GetComponent<BoxCollider>();
    if (boxCollider == null) {
        boxCollider = child.gameObject.AddComponent<BoxCollider>();
    }

}}

现在我可以上课了。 。 。 :

public class MyMonoBehaviour : MonoBehaviour {

    static public Component GetOrAddComponent (Transform child, System.Type type) {
        Component result = child.GetComponent(type);
        if (result == null) {
            result = child.gameObject.AddComponent(type);
        }
        return result;
    }

}

。 。 。所以这有效:

// class whatever : MyMonoBehavior {

BoxCollider boxCollider = GetOrAddComponent(child, typeof(BoxCollider)) as BoxCollider;

但我希望我能这样写:

BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();

我能提出的唯一想法是做得太复杂(用Transform替换每个MyTransform)因此不值得尝试。至少不只是为了更好的语法。

但是吗?或者还有其他方法可以实现吗?

3 个答案:

答案 0 :(得分:5)

您是否尝试过使用Extension Methods?您可以这样声明它们:

public static class MyMonoExtensions {

    public static T GetOrAddComponent<T>(this Transform child) where T: Component {
        T result = child.GetComponent<T>();
        if (result == null) {
            result = child.gameObject.AddComponent<T>();
        }
        return result;
    }

}

您可以将其称为实例方法,然后:

child.GetOrAddComponent<BoxCollider>();

有关扩展方法的详细信息,请参阅上面的链接。

答案 1 :(得分:2)

您可以使用自c#3.0以来的扩展方法

public static MonoBehaviourExtension
{
     public static void GetOrAdd(this MonoBehaviour thisInstance, <args>)
     {
           //put logic here
     }
}

答案 2 :(得分:1)

您可以使用扩展方法。

public static class Extensions
{
    public static T GetOrAddComponent<T>(this Transform child) where T : Component 
    {
            T result = child.GetComponent<T>();
            if (result == null) {
                result = child.gameObject.AddComponent<T>();
            }
            return result;
    }
}

现在您可以使用BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();