2016-07-08 80 views
2

我有以下的類,當我通過實體框架模型時,它的一個實例。如何在運行時使用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 
     }; 
    } 

    ... 
    ... 
    ... 
} 

我把這上面的類還從另一個類,像這樣

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

請注意,Client是實體框架6模型。

從我GetForeignRelation方法中,我設置的Client<TSource>的類型,所以我可以創建TableMapper類在運行時一個新的實例。

這是我試圖在運行時嘗試創建它的一個新實例。

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

但是這給了我一個錯誤。

類型或命名空間名稱RunTimeModel找不到(你 缺少using指令或程序集引用?)

我怎樣才能正確地運行創建相同類的新實例時間?

回答

1

你會得到TSource的類名

typeof(TSource).Name 

你應該能夠創建一個實例:只要

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

的類型是相同的組件 其它性能可用於獲得全名空間

編輯:

此示例是否適用於您的scanario? 不得不剝離下來您提供的代碼,因爲我不知道什麼是這一切的背後:)

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

我店'的typeof(TSource)'成變量'relationsMapping.ForeignRelation.ModelType'就像你可以在我的代碼中看到。然後我將它傳遞給'Activator.CreateInstance()',但它不適用於我。請參閱我的問題中的錯誤 – Jaylen

+0

我使用的情況與您編碼的情況類似。所以我需要創建一個'ReportRelation'的實例請記住,''是一個實體框架模型 – Jaylen

0

你不能傳遞變量的類型參數

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

做,因爲RunTimeModel是不是一個類型,但一變量。我認爲你錯過了你正在使用的方法的目的。

+0

我不知道我知道你告訴我在我的代碼中進行更改 – Jaylen

0

您可以使用下面的代碼來實例化你的泛型類型:

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

然而,返回值類型RunTimeMapper是object.I水溼弄清楚如何投RunTimeMapper其實際type.So ,使用起來有點不方便。

的Referer:How to: Examine and Instantiate Generic Types with Reflection

相關問題