2016-04-11 35 views
2

的類型/字符串名稱我有UDataModel類型的一個可變objDataModel其是從AbstractDataModel類型轉換使用

public class AbstractDataModel 
{ 
    internal string SomeName { get; set; } 
} 
public class UDataModel: AbstractDataModel 
{ 

} 

public class FDataModel: AbstractDataModel 
{ 

} 


public class UCommandProcessor : AbstractCommandProcessor<UDataModel> 
{ 

} 
public class FCommandProcessor : AbstractCommandProcessor<FDataModel> 
{ 

} 
public abstract class AbstractCommandProcessor<TDataModel> :SomeInterface<TDataModel> 
    where TDataModel: AbstractDataModel 
{ 

} 

繼承我有使用其中我能夠創建其對象類型UDataModelType即var tDataModelType= typeOf(UDataModel)的變量。

var tDataModel = (AbstractDataModel)Activator.CreateInstance(tDataModelType); 

我有一個類型的變量UCommandProcessor即var processorType= typeOf(UCommandProcessor) 我能夠創造的

var processor = Activator.CreateInstance(processorType); 

對象,但我不能把它強制轉換成UCommandProcessor 當我試圖

var processor = (AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType); 

我收到了例外

無法投射'ABC.Domain.UCommandProcessor'類型的對象以鍵入 'ABC.Common.Contract.AbstractCommandProcessor`1 [ABC.Common.Contract.AbstractDataModel]'。

有沒有像

var processor = (AbstractCommandProcessor<typeOf(tDataModel)>)Activator.CreateInstance(processorType); 

任何方法,即使我不能做喜歡

var processor = (AbstractCommandProcessor<typeOf(tDataModel)>)Activator.CreateInstance(processorType); 
+1

'UserDataModel'應該是'UDataModel'還是那兩種不同的類型? – 31eee384

+0

更新了問題,對不起造成的困惑 –

回答

2

演員不能工作,如果你投以AbstractCommandProcessor<AbstractDataModel>你基本上需要協方差,這是僅支持接口和委託。在這一行:

(AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType); 

演員陣容可能是一個AbstractCommandProcessor<FDataModel>顯然是無效的。我建議做一個抽象類AbstractCommandProcessor從通用版本派生,那麼你可以只投給非通用版本:

public abstract class AbstractCommandProcessor {} 

public class AbstractCommandProcessor<T> : AbstractCommandProcessor, SomeInterface<T> 
              where T: AbstractDataModel 

... 
var processor = (AbstractCommandProcessor)Activator.CreateInstance(processorType); 

編輯:如果你並不真正需要的類,你可以使它的接口和協方差工作:

public interface AbstractDataModel { } 
public class UDataModel : AbstractDataModel { } 
public class FDataModel : AbstractDataModel { } 


public class UCommandProcessor : AbstractCommandProcessor<UDataModel> { } 
public class FCommandProcessor : AbstractCommandProcessor<UDataModel> { } 
public interface AbstractCommandProcessor<out TDataModel> : SomeInterface<TDataModel> 
where TDataModel : AbstractDataModel 
{ } 

public interface SomeInterface<out TDataModel> where TDataModel : AbstractDataModel { } 

... 

var processor = 
    (AbstractCommandProcessor<AbstractDataModel>)Activator.CreateInstance(processorType); 

這是因爲協方差(在out關鍵字,這意味着你可以使用的東西比一般的約束指定多個派生)的工作。

+0

非常感謝亞歷山大。我正在使用您建議的第一個選項。 –

+0

我有一個方法 public class AbstractModel(T Model)在類 public class AbstractCommandProcessor ,但是在類型轉換後,我無法調用該方法,因爲AbstractCommandProcessor沒有該方法。 :( –

+0

@RoshanGhangare爲什麼不在抽象基類中實現'public abstract void LoadModel(AbstractDataModel model);'在派生類中,您將擁有:'public override void LoadModel(AbstractDataModel model)',並且可以在該方法中使用將模型轉換爲T:'LoadModel(AbstractDataModel模型){T derivedModel =(T)model; ....}' –