2016-12-02 8 views
3

リンクの怠惰な方法で相続のクラス名を取得します。私が見つけたものは何も役立ちません。私は、基本クラスの静的メソッドで相続のクラス名を取得しようとした <a href="https://dotnetfiddle.net/4QTGx3" rel="nofollow noreferrer">https://dotnetfiddle.net/4QTGx3</a></p> <p>C#のフィドルにここでは、基本クラス

public class Worker 
{ 
    public string Id1 {get; set;} 
    public string Id2 {get; set;} 
    public string Id3 {get; set;} 
} 

public interface IModel 
{ 
} 

public class Model1: IModel 
{ 
} 

public class Model2: IModel 
{ 
} 

public class ModelActor <TModel> where TModel: IModel 
{ 
    private Lazy<Worker> _worker = new Lazy<Worker>(
     () => new Worker() 
     { 
      Id1 = new StackFrame().GetMethod().DeclaringType.Name, 
      Id2 = MethodBase.GetCurrentMethod().DeclaringType.Name, 
      Id3 = typeof(ModelActor <TModel>).Name 
     } 
    ); 

    public Worker Worker 
    { 
     get 
     { 
      return _worker.Value; 
     } 
    } 
} 

public class ModelActor1: ModelActor<Model1> 
{ 
} 

public class ModelActor2: ModelActor<Model2> 
{ 
} 

public static void Main() 
{ 
    Console.WriteLine("Id1: {0} {1}", new ModelActor1().Worker.Id1, new ModelActor2().Worker.Id1); 
    Console.WriteLine("Id2: {0} {1}", new ModelActor1().Worker.Id2, new ModelActor2().Worker.Id2); 
    Console.WriteLine("Id3: {0} {1}", new ModelActor1().Worker.Id3, new ModelActor2().Worker.Id3); 

    Console.WriteLine("Want to get: ModelActor1 ModelActor2"); 
} 
+0

「メイン」以外は、ここでは「静的」は表示されません。 (私はそれが関係しているとは確信していませんが、タイトル/初期の物語の中にたくさん作ったようです) –

+0

@Damien_The_Unbelieverレイジーコンストラクタのコンテンツは、クラス内の実装を含むことはできません。 so ... static –

答えて

0

大丈夫です。 2つ目のModelActorクラスを追加する必要があります。なぜなら、1つのシグネチャしか呼び出されていないからです。

using System; 
using System.Reflection; 
using System.Diagnostics; 

public class Program 
{ 

public class Worker 
{ 
    public string Id1 {get; set;} 
    public string Id2 {get; set;} 
    public string Id3 {get; set;} 

    public string ModelName {get; set;} 
} 

public interface IModel 
{ 
} 

public class Model1: IModel 
{ 
} 

public class Model2: IModel 
{ 
} 

public class ModelActor <TModel> where TModel: IModel 
{ 
    private Lazy<Worker> _worker = new Lazy<Worker>(
     () => { 
       Console.WriteLine("Worker Instance created"); 

       return new Worker() 
       { 
        Id1 = new StackFrame().GetMethod().DeclaringType.Name, 
        Id2 = MethodBase.GetCurrentMethod().DeclaringType.Name, 
        Id3 = typeof(ModelActor <TModel>).Name, 

        ModelName = typeof(TModel).Name 
       }; 
     } 
    ); 

    public Worker Worker 
    { 
     get 
     { 
      return _worker.Value; 
     } 
    } 
} 


public class ModelActor2 <TModel> where TModel: IModel 
{ 
    private Lazy<Worker> _worker = new Lazy<Worker>(
     () => { 
       Console.WriteLine("Worker Instance created"); 

       return new Worker() 
       { 
        Id1 = new StackFrame().GetMethod().DeclaringType.Name, 
        Id2 = MethodBase.GetCurrentMethod().DeclaringType.Name, 
        Id3 = typeof(ModelActor <TModel>).Name, 

        ModelName = typeof(TModel).Name 
       }; 
     } 
    ); 

    public Worker Worker 
    { 
     get 
     { 
      return _worker.Value; 
     } 
    } 
} 

public class ModelActor1: ModelActor<Model1> 
{ 
} 

public class ModelActor2: ModelActor2<Model2> 
{ 
} 

public static void Main() 
{ 
    Console.WriteLine("Id1: {0} {1}", new ModelActor1().Worker.Id1, new ModelActor2().Worker.Id1); 
    Console.WriteLine("Id2: {0} {1}", new ModelActor1().Worker.Id2, new ModelActor2().Worker.Id2); 
    Console.WriteLine("Id3: {0} {1}", new ModelActor1().Worker.Id3, new ModelActor2().Worker.Id3); 

    Console.WriteLine("Want to get: ModelActor1 ModelActor2\n"); 

    Console.WriteLine("ModelName: {0} {1}", new ModelActor1().Worker.ModelName, new ModelActor2().Worker.ModelName); 
    Console.WriteLine("No problem with model name."); 
} 
} 
+0

あなたのケースは元の質問とは異なります。あなたは共通の基本クラスでWorkerの実装を取り除いています –

関連する問題