2012-08-28 50 views
2

我有以下類定義:試圖構建C#泛型類型失敗MissingMethodException

public abstract class ControllerBase<T, V> : Controller where T : EntityBase<T> where V : GenericRepository<T> 

再後來就在課堂上,我有以下代碼:

private V _repo; 
... 
_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c); 

這只是編譯精細。然後我有一個類定義如下:

public class SecurityRoleController : ControllerBase<SecurityRole, GenericRepository<SecurityRole>> 

這也編譯得很好。但是,當我嘗試在我的瀏覽器中打開/ SecurityRole時,我得到一個異常,即Constructor on type GenericRepository'1 not found。 (請注意,它實際上是異常中的倒退,但打破了SO格式化。)儘管GenericRepository<T>具有公共構造函數,但在嘗試直接創建類的實例時工作得很好。

任何人都知道我可以如何正確構建一個類的通用實例嗎?

TIA,
班吉

編輯:

構造的GenericRepository

public GenericRepository(DbContext dbContext, Context c, string[] includes = null) 
{ 
    _dbContext = dbContext; 
    _c = c; 
    if (includes != null) 
    { 
     _includes = includes; 
    } 
    return; 
} 

而且,該種_dbC_cDbContextContext,該類型的GenericRepository要求在它的構造函數 - 是的,我從.GetType().FullName得到這些。有什麼想法嗎?

+1

當你說它「的作品就好了一個公共構造」 - 它是一個公共*參*構造函數? –

+0

不,它是一個公共構造函數,它接受我通過上面的Activator.CreateInstance行傳遞的兩個參數。對不起 - 好的電話。 – benjy

+1

你的代碼看起來不錯。你可以請張貼你的構造函數聲明和*精確*類型(最好通過輸出'_dbC'和'_c'的'_dbC.GetType()。FullName')的結果嗎? –

回答

4

您的構造函數聲明瞭三個參數。但是,你要Activator.CreateInstance通話只有在通過兩個參數 - 這不是一個值傳遞的最後一個參數(其擁有默認值 - string[] includes = null):

_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c); 

CreateInstance要求所有的參數中指定 - 它將其方法重載解析算法基於您傳遞的參數,並且不考慮默認參數的可能性。因此,要解決,只是通過在null(默認值)作爲最後一個參數:

_repo = (V)Activator.CreateInstance(typeof(V), _dbC, _c, null); 
+0

您正在使用默認參數。編譯器會將你的代碼重新寫入新的東西(...,null),然後編譯它。由於您沒有使用編譯器的智能,您需要自己完成工作。這意味着傳遞可選參數的值,因爲從語法的角度來看,它們確實不是「可選的」異常。 –

+0

就是這樣。非常感謝您的幫助,併爲我教授關於編譯器的新知識! – benjy

+0

@benjy,很高興我能幫上忙。雖然是迂腐的,但編譯器實際上已經處理了這種情況 - 它是* runtime *方法的重載解析,它不如編譯時解析複雜。 :) –