2016-07-08 5 views
2

私はインスタンスの作成時にEntity Framework Modelを渡す次のクラスを持っています。実行時にC#を使用してクラスの新しいインスタンスを作成するにはどうすればよいですか?

public class TableMapper<TSource> 
{ 
    protected IQueryExtractor QueryExtractor { get; set; } 
    protected string TableAliasPrefix { get; private set; } 

    public TableMapper(IQueryExtractor queryExtractor, string tableAliasPrefix = null) 
    { 
     QueryExtractor = queryExtractor; 
     TableAliasPrefix = tableAliasPrefix; 
    } 

    public IReportRelation GetForeignRelation<TProperty>(Expression<Func<TSource, TProperty>> property) 
    { 
     return new ReportRelation 
     { 
      Column = GetReportColumn(null, Self, property), 
      TableName = this.Table(), 
      TableAlias = this.GetSqlAlias(), 
      ModelType = typeof(TSource), 
      QueryExtractor = this.QueryExtractor 
     }; 
    } 

    ... 
    ... 
    ... 
} 

私はClientは、Entity Frameworkの6モデルであることに注意してくださいので

var clientMapper = new TableMapper<Client>(QueryExtractor, "Client"); 
var = clientMapper.GetForeignRelation(x => x.Id); 

のような他のクラスから、まだこの上のクラスを呼び出します。

GetForeignRelation方法の中から、私はので、私は、実行時にTableMapperクラスの新しいインスタンスを作成することができClientまたは<TSource>のタイプを設定します。

ここでは、実行時に新しいインスタンスを作成しようとしました。

var RunTimeModel = Activator.CreateInstance(relationsMapping.ModelType); 
var RunTimeMapper = new TableMapper<RunTimeModel>(relationsMapping.QueryExtractor, relationsMapping.TableAlias); 

しかし、それは私にエラーを与えています。

RunTimeModelが見つかりませんでした型または名前空間名は(あなた がusingディレクティブまたはアセンブリ参照が不足している?)

どのように私が正しく実行時に同じクラスの新しいインスタンスを作成することができます時間?

あなたがしてTSOURCEのクラス名を取得します

答えて

1

typeof(TSource).Name 

あなたがしてインスタンスを作成することができるはずです:タイプは同じアセンブリである限り

var instance = Activator.CreateInstance(typeof(TSource)); 

その他のプロパティ完全な名前空間を得るために使用できます

編集:

この例はあなたのscanarioに当てはまりますか? RunTimeModelがタイプではないですので が、私はそれをすべての背後に何があるか分からないようご用意コードを下に取り除くために持っていた:)

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new TableMapper<A>(); 
     var fr = test.GetForeignRelation(); 
     var type = fr.ModelType; 
     var newInstance = Activator.CreateInstance(type); 
    } 
} 

public class TableMapper<TSource> 
{ 

    public TableMapper() 
    { 
    } 

    public ReportRelation GetForeignRelation() 
    { 
     return new ReportRelation 
     { 
      ModelType = typeof(TSource) 
     }; 
    } 
} 

public class ReportRelation 
{ 
    public Type ModelType { get; set; } 
} 

public class A 
{ 
    public string Test { get; set; } 
    public A() 
    { 
     Test = "Some string"; 
    } 
} 
+0

私はあなたが私のコードで見ることができるような変数 'relationsMapping.ForeignRelation.ModelType'に' 'typeof演算(TSOURCE)格納します。それを 'Activator.CreateInstance()'に渡しますが、それは私のためには機能しません。私の質問 – Jaylen

+0

のエラーを参照してください私はあなたがコード化したものに似ています。そこで、私は 'ReportRelation'のインスタンスを作成する必要があります。' 'はEntity Frameworkモデルです – Jaylen

0

あなたは型パラメータ

var RunTimeModel = Activator.CreateInstance(relationsMapping.ModelType); 
var RunTimeMapper = new TableMapper<RunTimeModel>(relationsMapping.QueryExtractor, relationsMapping.TableAlias) 

に変数を渡すことはできません変数。私は、あなたが使っている方法の目的を欠いていると思います。

+0

私はあなたが私のコードで変更するように言っているか分かりません – Jaylen

0

はあなたのジェネリック型をインスタンス化するために、次のコードを使用することができます。

var RunTimeMapper = Activator.CreateInstance(typeof(TableMapper<>).MakeGenericType(new[] { relationsMapping.ModelType }), new[] { relationsMapping.QueryExtractor, relationsMapping.TableAlias }); 

しかし、RunTimeMapperの戻り値の型があるobject.Iは、その実際のtype.SoにRunTimeMapperをキャストする方法を見つけ出す望めません使用するのに少し不便です。

リファラー:How to: Examine and Instantiate Generic Types with Reflection

関連する問題