如何在运行时通过反射获得重载?

时间:2010-08-02 15:06:16

标签: c# linq-to-sql reflection

因为我工作的地方迫使我使用存储过程而且我没有足够长的时间来阻止它我已经为我们所有存储过程定制了LiNQ到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 获得重载?

编辑:澄清我们不允许使用数据库表。

1 个答案:

答案 0 :(得分:1)

我忘记了linq!在这个特殊情况下,我只有两个方法,一个包含1个参数,另一个包含所有其他参数,所以一个简单的(见下文)工作正常:

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