2010-08-02 61 views
0

由於我工作的地方迫使我使用存儲過程,而且我還沒有足夠長的時間來阻止它,所以我已經爲我們的所有存儲過程定製了LiNQ to SQL代碼生成。是的,這是正確的,我們已經存儲了我們所有數據訪問的程序,並且自我們沒有表訪問這意味着我們通常最終爲所有「實體」提供3個類。現在,當我撞牆時,我正在完成最新的更改。如何通過運行時反射來獲取重載?

下面的代碼不起作用,原因是它自己調用,但我需要得到過載。其原因是,不可能跟蹤40個參數,因此我在項目構建時生成一個「動態」類。

[Function(Name="dbo.user_insert")] 
public IList<ProcedureResult> UserInsert(UserInsertObj userInsertObj) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), 
     userInsertObj.UserId, userInsertObj.ProductId, userInsertObj.FromIp, 
     userInsertObj.CampaignName, userInsertObj.Campaign, userInsertObj.Login, 
     userInsertObj.Password, userInsertObj.Nickname, userInsertObj.Pin, userInsertObj.Language, 
     userInsertObj.Currency, userInsertObj.Country, userInsertObj.Region, userInsertObj.Birthday, 
     userInsertObj.FirstName, userInsertObj.MiddleName, userInsertObj.LastName, 
     userInsertObj.Address1, userInsertObj.Address2, userInsertObj.Address3, userInsertObj.Zip, 
     userInsertObj.City, userInsertObj.Timezone, userInsertObj.Email, userInsertObj.EmailNotify, 
     userInsertObj.Gender, userInsertObj.Phone, userInsertObj.MobileCc, userInsertObj.MobileNr, 
     userInsertObj.MobileModel, userInsertObj.Referral, userInsertObj.GroupId, 
     userInsertObj.StreetNumber, userInsertObj.StreetName); 

    return new List<ProcedureResult> 
    { 
     new ProcedureResult 
     { 
      Name = "userId", 
      Value = result.GetParameterValue(0), 
      Type = typeof(System.Nullable<System.Int32>) 
     } 
    }; 
} 

我打得四處使用類似下面的,但不知道其超載使用和搜索MSDN我還沒有接近任何有用的東西呢。

((MethodInfo)MethodInfo.GetCurrentMethod()).DeclaringType.GetMethod("", new Type[] {}) 

我將如何實現獲得過載從CurrentMethod

編輯:澄清,我們不允許使用數據庫表。

+0

似乎是一個bizare方法來調用使用LinqToSQL存儲過程,你這樣做知道你可以將它們映射到你的DataContext類的方法嗎? – 2010-08-02 15:11:34

+0

@本,謝謝!我已更新有關您的評論的問題。 – mhenrixon 2010-08-02 15:16:03

+0

[如何使用反射調用.NET中的重載方法]的可能重複(http://stackoverflow.com/questions/223495/how-to-use-reflection-to-invoke-an-overloaded-method-in -淨) – mhenrixon 2010-08-02 16:10:12

回答

1

我忘了linq!在這種特殊情況下,我只有兩個方法含1個參數之一,一個包含所有其他參數所以一個簡單的(見下文)正常工作:

method.DeclaringType.GetMethods() 
    .Where(x => x.Name == "UserInsert" 
      && x.GetParameters().Count() > 1) 
    .Single()