2014-12-22 2 views
2

Итак, у меня есть куча функций, которые я использую OVER AND OVER снова повсюду в случайных областях. А также некоторые геттеры и сеттеры.C# Code Injection?

Например просто вещи, как это:

public GameObject GameObjectCache 
{ 
    get 
    { 
     if (gameObjectCache == null) 
      gameObjectCache = this.gameObject; 
     return gameObjectCache; 
    } 
} 
private GameObject gameObjectCache; 

public Transform TransformCache 
{ 
    get 
    { 
     if (transformCache == null) 
      transformCache = this.GetComponent<Transform>(); 
     return transformCache; 
    } 
} 
private Transform transformCache; 

Это для единства, если вы не можете сказать.

Что бы я хотел сделать, это взять эти функции и поместить их в другое место. Тогда в моих классах вобще как

[TransformCache] 

какой-то одной линии теге, и было бы поместить функцию, из других источников, встроенный в мой класс.

Я знаю, что есть один сложный способ сделать это с Mono.Cecil, который, если у кого есть простой учебник по этому поводу, мне понравится ссылка.

Но есть ли более простой способ? Я знаю C и Objective-C, и даже CG-код имеет функции для этого. Есть ли способ сделать это на C# с легкостью?

+0

Взгляните на PostSharp: http://www.postsharp.net/ –

+0

Вам нужна инъекция инъекций инъекций или инъекций? Взгляните на структуру MS Unity для управления зависимостью. –

+0

Не уверен, что MEF работает в единстве, но он будет делать то, что вы ищете. – JRLambert

ответ

1

Я не знаю, поможет вам это или нет, но как насчет обертывания некоторых из этих общих вещей, которые вы хотите, в класс-оболочку, а затем просто добавьте класс в другой игровой объект. Что-то вроде

public class MyWrapper 
{ 
    private GameObject parentGameObj; 
    public MyWrapper(GameObject srcObj) 
    { 
     parentGameObj = srcObj; 
    } 

    public GameObject GameObjectCache 
    { 
     get 
     { 
      if (gameObjectCache == null) 
       gameObjectCache = parentGameObj.gameObject; 
      return gameObjectCache; 
     } 
    } 
    private GameObject gameObjectCache; 

    public Transform TransformCache 
    { 
     get 
     { 
      if (transformCache == null) 
       transformCache = parentGameObj.GetComponent<Transform>(); 
      return transformCache; 
     } 
    } 
    private Transform transformCache; 
} 

Тогда, в классах, которые вы будете использовать его

public class YourOtherClass : GameObject 
{ 
    MyWrapper mywrapper; 

    public Start() 
    { 
     // instantiate the wrapper object with the game object as the basis 
     myWrapper = new MyWrapper(this); 

     // then you can get the game and transform cache objects via 
     GameObject cache1 = myWrapper.GameObjectCache; 
     Transform tcache1 = myWrapper.TransformCache; 
    } 
} 

... К сожалению, в C++ вы можете получить из нескольких классов, которые по своей сути может позволить что-то подобное. Единственное, что я могу придумать, - это использовать Generics, если ваши функции используют повторные аналогичные типы через вызовы GetComponent().

+0

Я делал это много. В какой-то степени это может быть хорошо. Но метод, который я описываю в открытии, позволит использовать более чистый код VASTLY с тем, как мои классы заканчиваются. – rygo6

+0

@techmage, пересмотренное примечание внизу ответа. – DRapp

+0

Я начал использовать это и на самом деле очень понравился. Спасибо. – rygo6