2017-07-07 1 views
0

Ich möchte einige generische Funktionen für die spätere Ausführung speichern. Das Problem entsteht über die Argumente von Funktionen. Für verschiedene Typen möchte ich denselben generischen Funktionsdelegaten erstellen und speichern, aber ich kann es nicht tun. Unten ist meine Version der Klasse, um Funktionen zu erhalten;Speichern einer Funktionsvorlage

public delegate void CGTaskHandler1<T>(T value) where T : IControllerBase; 

public class CGTask 
{ 

    private CGTaskHandler1<IControllerBase> Aksiyon; 
    private IControllerBase param; 

    public void RegisterCGTask(CGTaskHandler1<IControllerBase> aFunc, IControllerBase aParam) 
    { 
     Aksiyon = aFunc; 
     param = aParam; 
    } 


    public void ExecuteCGTask() 
    { 
     try 
     { 
      Aksiyon(param); 
     } 
     catch (Exception ex) 
     { 
      Logger.SetLog("action execution failed ", LogType.error, ex.Message) 
     } 
    } 
} 

von dieser Klasse I eine Schnittstelle verwendet, jede andere Art von Argumente unter demselben Namen zu sammeln, wollen aber Compiler genau die gleiche Art und Interface-Typen zu helfen scheinen nicht.

private void LoadScene(cScene ascn) 
    { 
     ascn.LoadScene(); 
    } 

    public CGTask GetTask(String btnName) 
    { 
     CGTask back = new CGTask(); 
     CGTaskHandler1<IControllerBase> alomelo = LoadScene; // type mismatch 
     back.RegisterCGTask(alomelo, thisScene); 

     //CGTask2<cScene> back = new CGTask2<cScene>(); 
     //CGTaskHandler1<cScene> alomelo = LoadScene; 
     //back.RegisterCGTask(alomelo, thisScene); 

     return back; 
    } 

so änderte ich meine cgtask Klasse auf eine generische Klasse, so würde Argument Typ da bestimmt sein, wenn Klasse instanziiert wird.

public class CGTask2<T> 
{ 

    private CGTaskHandler1<T> Aksiyon; 
    private T param; 

    public void RegisterCGTask(CGTaskHandler1<T> aFunc, T aParam) 
    { 
     Aksiyon = aFunc; 
     param = aParam; 
    } 

    public void ExecuteCGTask() 
    { 
     try 
     { 
      Aksiyon(param); 
     } 
     catch (Exception ex) 
     { 
      Logger.SetLog("action execution failed ", LogType.error, ex.Message); 
     } 
    } 
} 

gleiches Problem konfrontiere ich jedoch, wenn ich sie in einer Liste sammeln möchte.

List<CGTask2<IControllerBase>> gorevler = new List<CGTask2<IControllerBase>>(); 
    gorevler.Add(new CGTask2<cScene>()); // type mismatch 

Ich brauche eine Möglichkeit, Funktionen wie Objekte zu behalten. Jedes Mal, wenn ich einen generischen Funktionsdelegaten verwende, muss ich den Typ angeben, und die Typen generischer Funktionen sind nicht konvertierbar. Gibt es eine Möglichkeit dies zu tun, Referenzen auf Funktionen zu behalten und diese Referenzen als Objekte zu sammeln?

public interface IControllerBase 
    { 
     void GetTalker(); 
     void InitiliazeTalker(); 
    } 

    public class cControllerBase : IControllerBase 
    { 
     public cControllerBase Parent=null; 

     protected Talker tk; 

     protected void GetTalker() 
     { 
      tk = Talker.Instance; // not initialized yet 
     } 

     protected void InitiliazeTalker() 
     { 
      tk.InitializeReTalk(); 
     } 

    } 

    public class cScene : cControllerBase, IControllerBase 
    { 
     public String ID; 
     public String ScenePath; 
     public String SceneName; 
     public int Slot; 
     public String DBParent; 
     public List<cAnimation> Animations; 
     public List<cExport> Exports; 
     public Boolean IsActive; 

     public cScene() 
     { 
      GetTalker(); 
      Animations = new List<cAnimation>(); 
      Exports = new List<cExport>(); 
      // ID = Guid.NewGuid().ToString(); 
      IsActive = false; 
     } 

     public Boolean ParseXml(String pXmlPath) 
     { 
      if (String.IsNullOrEmpty(pXmlPath)) return false; 
      XmlDocument xdoc = new XmlDocument(); 
      XmlNodeList anims = null; 
      XmlNodeList exps = null; 
      try 
      { 
       xdoc.Load(pXmlPath); 
       anims = xdoc.SelectNodes("//scene_description/animations/animation"); 
       exps = xdoc.SelectNodes("//scene_description/exports/export"); 
      } 
      catch (Exception ex) 
      { 
       Logger.SetLog("xml parse error", LogType.error, ex.Message); 
       return false; 
      } 


      cAnimation tempanim; 
      cExport tempexport; 

      foreach (XmlNode x in anims) 
      { 
       tempanim = new cAnimation(); 
       foreach (XmlAttribute y in x.Attributes) 
       { 
        switch (y.Name) 
        { 
         case "name": 
          { 
           tempanim.AnimationName = y.Value; 
           break; 
          } 
         case "duration": 
          { 
           tempanim.AnimationDuration = Globals.GetIntValue(y.Value); 
           break; 
          } 
         case "end_animation_time": 
          { 
           tempanim.AnimationEndTime = Globals.GetIntValue(y.Value); 
           break; 
          } 
         case "start_animation_time": 
          { 
           tempanim.AnimationStartTime = Globals.GetIntValue(y.Value); 
           break; 
          } 
        } 
       } 
       tempanim.Parent = this; 
       Animations.Add(tempanim); 
      } 

      foreach (XmlNode x in exps) 
      { 
       tempexport = new cExport(); 
       foreach (XmlAttribute y in x.Attributes) 
       { 
        switch (y.Name) 
        { 
         case "name": 
          { 
           tempexport.ExportName = y.Value; 
           break; 
          } 
         case "type": 
          { 
           switch (y.Value) 
           { 
            case "String": 
             { 
              tempexport.ExportType = ExportDataType.tString; 
              break; 
             } 
            case "File": 
             { 
              tempexport.ExportType = ExportDataType.tFile; 
              break; 
             } 
            case "Float": 
             { 
              tempexport.ExportType = ExportDataType.tFloat; 
              break; 
             } 
            case "Int": 
             { 
              tempexport.ExportType = ExportDataType.tInt; 
              break; 
             } 
            case "Bool": 
             { 
              tempexport.ExportType = ExportDataType.tBool; 
              break; 
             } 
           } 
           break; 
          } 
         case "value": 
          { 
           tempexport.ExportValue = y.Value; 
           break; 
          } 
        } 
       } 
       tempexport.Parent = this; 
       Exports.Add(tempexport); 
      } 


      return true; 

     } 

     public void ActivateScene() 
     { 
      tk.ActivateScene(Slot, SceneName); 
      IsActive = true; 
     } 

     public void DeactivateScene() 
     { 
      // to do 
      // tk'dan aktif scene listesi yapıp kontrol edebiliyor musun? 
      tk.DeactivateScene(Slot); 
      IsActive = false; 
     } 

     public Boolean IsSceneLoaded() 
     { 
      Boolean back = false; 
      back = tk.IsSceneLoaded(SceneName); 
      return back; 
     } 

     public void LoadScene() 
     { 
      tk.LoadScene(SceneName); 
     } 

     public void UnloadScene() 
     { 
      tk.UnloadScene(SceneName); 
     } 

     public void SetSceneName(String strxmlPath) 
     { 
      ScenePath = strxmlPath; 
      SceneName = strxmlPath.Substring(0, strxmlPath.LastIndexOf('\\')); 
      SceneName = SceneName.Replace('\\', '/'); 
      SceneName = SceneName.Substring(SceneName.IndexOf("Projects") + 9); 

     } 
    } 
+0

Was ist ein 'cScene'? – DavidG

+0

Ich fügte cScene-Klassendefinition –

Antwort

0

Gut ein CGTask2<cScene> ist eine ganz andere Art zu CGTask2<IControllerBase>, können Sie die beide nicht zu. Sie müssten zum Beispiel eine Liste von ITask haben und CGTask2 das implementieren. Zum Beispiel:

public interface ITask {} 

public class CGTask2<T> : ITask 
{ 
    //snip 
} 

Und jetzt können Sie dies tun:

List<ITask> gorevler = new List<ITask>(); 
gorevler.Add(new CGTask2<cScene>()); 
+0

danke für das Helfen hinzu –

Verwandte Themen