2014-11-12 5 views
1

RTS 게임을 만들고 있습니다. RTS 게임의 모든 유닛은 순찰, 공격 또는 빌드과 같은 일부 작업을 수행 할 수 있습니다. 통합으로 C# 스크립트의 stringinteger 배열을 쉽게 수동으로 채울 수 있습니다.string에서 클래스 인스턴스를 만들고 생성자를 호출하십시오.

이 때문에 나는 string[] str_actions 배열을 영원히 단위로 가지고 있고 단위가 처음 초기화 될 때이 배열을 Action[] actions으로 변환하는 것이 가장 쉽다고 결정했습니다.

아마 do this 할 수 있습니다

string className = "Attack" 
Assembly assembly = Assembly.Load("Actions"); 
Type t = assembly.GetType("Actions."+className); 
Action action = (Action)Activator.CreateInstance(t); 

하지만이 두 가지 문제를 처리하지 않습니다 className가 참조하는 0 인수

  • 가능성 소요 생성자가없는

    1. 액션 Action의 자식이 아닌 클래스

    어떻게 처리합니까?

  • +0

    리플렉션을 사용하지 마십시오. 상속을 사용하십시오. 선택한 경우 직렬화를 사용하여 목록을 저장하지 않을 수 있습니다. – BradleyDotNET

    +0

    저는 상속을 사용하고 있습니다. 모든 행동은'추상적 인 계급 행동'의 자녀입니다. 그러나 직렬화 [C#에서 * 리플렉션 사용] (http://msdn.microsoft.com/en-us/library/ee436098.aspx) - 문자열 인스턴스에서 클래스 인스턴스를 얻으려면 어떻게해야합니까? –

    +0

    물론,이 모든 것을 사용자에게 반영하기 때문에 두 가지 질문에 대해 걱정할 필요가 없습니다 (아무도 수동으로 파일을 수정하지 않는다고 가정). 또는 당신이 걱정하고있는 것이 무엇입니까? – BradleyDotNET

    답변

    0

    는 질문에 대답하려면 :

    1. 그게 전부 확인을! 이 과부하 Activator.CreateInstance : MSDN을 사용하면 개체 []을 전달할 수 있으며 가장 잘 맞는 생성자를 찾을 수 있습니다. 기본 생성자가 인 것은 좋은 생각인데, 특히 직렬화를 사용하려는 경우에는입니다.

    2. 당신이 그것을 피할 수 있다는 의미에서 "처리"할 수는 없습니다. 그러나 캐스트가 실패하면 코드는 InvalidCastException이됩니다. 캐스트가 무효 인 경우

      Action action = Activator.CreateInstance(t) as Action; 
      

      지금 action 그냥 대신 던지고, null를 개최한다 : 것을 방지하기 위해, as 연산자를 사용합니다.

    주의 사항 : Activator.CreateInstance은 C#에서의 올바른 선택입니다. 일반적으로 직접 인스턴스화 또는 비 직렬화를 사용하려고합니다. 허용, 역 직렬화 리플렉션을 사용합니다. 그러나 모든 지저분한 세부 사항은 추상화됩니다.

    +0

    생성자가 발견되지 않으면 'null'도 얻는 건가요? –

    +1

    @ TomášZato 설명서에 따르면, 'MissingMethodException'이 발생합니다. 그것을 처리하기 위해 try/catch가 필요할 것입니다. – BradleyDotNET

    0

    그래서 알아 냈습니다. 나는 그것을 정적 메소드 Action.fromString으로 만들고있다. 내가 부족한 것은 ConstructorInfo 개체를 반환하는 Type.GetConstructor 메서드입니다. 게시 된

    public static Action fromString(string className, string defName, WorldObject actor) 
        { 
         //Get the Assembly (namespace) 
         Assembly assembly = Assembly.Load("Actions"); 
         //Get the exact class Type 
         Type t = assembly.GetType("Actions." + className); 
         //Get the info about constructor (using array literal) 
         // - for every accepted parameter enter typeof(parameterType) 
         ConstructorInfo constructor = t.GetConstructor(new Type[] { typeof(string), typeof(WorldObject) }); 
         //Initialise the Type instance 
         System.Object action = constructor.Invoke(new System.Object[] { defName, actor }); 
         //If it's child of the main class 
         if (action is Action) 
          return (Action)action; 
         //Error otherwise 
         else 
         { 
          Debug.LogError("'" + className + "' is not child of Action!"); 
          return null; 
         } 
        } 
    
    +0

    그걸 할 수있는 한 가지 방법은 ... – BradleyDotNET

    관련 문제