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

cre*_*gox 2 c# behavior

团结CSHARP,我想打一个GetOrAddComponent方法,这将简化respectives 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>();
    }

}}
Run Code Online (Sandbox Code Playgroud)

现在我可以上这堂课...:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

...这样可行:

// class whatever : MyMonoBehavior {

BoxCollider boxCollider = GetOrAddComponent(child, typeof(BoxCollider)) as BoxCollider;
Run Code Online (Sandbox Code Playgroud)

但我希望我能这样写:

BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();
Run Code Online (Sandbox Code Playgroud)

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

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

Bot*_*000 5

您是否尝试过使用扩展方法?你可以像这样声明它们:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以像实例方法一样调用它,然后:

child.GetOrAddComponent<BoxCollider>();
Run Code Online (Sandbox Code Playgroud)

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