2015-07-31 3 views
0

Моя цель - расширить объект MonoBehaviour от движка Unity3D с помощью моей функциональности. Это то, что я делаю:Расширение методов расширения MonoBehaviour

public static class Extensions { 

    public static T GetComponentInChildren<T>(this UnityEngine.MonoBehaviour o, bool includeInactive) { 
     T[] components = o.GetComponentsInChildren<T>(includeInactive); 
     return components.Length > 0 ? components[0] : default(T); 
    } 
} 

Но когда я собираюсь использовать его, я могу получить доступ к нему только тогда, когда я использую this перед вызовом: this.GetComponentInChildren(true) Но this должен быть неявным, верно?

Так я предполагаю, что я делаю что-то неправильно ...

Вот где я использую расширение:

public class SomeController : MonoBehaviour { 

    private SomeComponent component; 

    void Awake() { 
     component = this.GetComponentInChildren<SomeComponent>(true); 
    } 
} 

Я надеюсь, что я сделал моя проблема ясна. Есть ли способ расширить MonoBehaviour правильно (без необходимости использовать ключевое слово this явно) или почему он ведет себя таким образом?

+1

Посмотрите на это так [вопрос] (http://stackoverflow.com/questions/3510964/why-is-the-this-keyword-required-to-call-an-extension-method-from-within-the-e). –

ответ

0

Это дизайн (язык).

Если вы используете метод расширения внутри, ожидается, что класс явный this. Другими словами, явный оператор object expression и . должен выполнять вызов метода расширения. В случае внутреннего использования это this

Однако лучшее решение в вашем случае будет:

public class YourMonoBehaviourBase : MonoBehaviour { 

    public T GetComponentInChildren<T>(bool includeInactive) { 
     T[] components = GetComponentsInChildren<T>(includeInactive); 
     return components.Length > 0 ? components[0] : default(T); 
    } 
} 

, то вы можете использовать его:

public class SomeController : YourMonoBehaviourBase { 

    private SomeComponent component; 

    void Awake() { 
     // No explicit this necessary: 
     component = GetComponentInChildren<SomeComponent>(true); 
    } 
} 
Смежные вопросы