为什么objectdatasource正在执行过时的方法而没有任何错误?

时间:2015-11-21 13:48:48

标签: c# asp.net objectdatasource obsolete

ObjectDataSource无法识别过时的方法并将其作为常规方法执行。

ObjectDataSource没有识别过时的属性,因为代码隐藏文件识别过时的方法并在编译/构建期间抛出错误。

public class TEST
{
    public TEST()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    [Obsolete("Old method", true)]
    public DataTable GetData()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Desc");

        for (int i = 0; i < 10; i++)
        {
            DataRow drow = dt.NewRow();
            drow[0] = "Name_" + i.ToString();
            drow[1] = "Desc_" + i.ToString();

            dt.Rows.Add(drow);
        }

        return dt;
    }
}

ASPX

<form id="form1" runat="server">
    <div>
        <asp:GridView ID="Gridview1" runat="server" DataSourceID="ObjectDataSource1" EnableModelValidation="True"></asp:GridView>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName="TEST"></asp:ObjectDataSource>
    </div>
</form>

ASPX.CS

Code behind page throwing an error for obsolete method

我在这里错过了任何设置吗?如果需要其他信息,请帮助并告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题是标记在设计时没有编译

<asp:ObjectDataSource ID="ObjectDataSource1" 
                      runat="server" 
                      SelectMethod="GetData" 
                      TypeName="TEST">
</asp:ObjectDataSource>

因此,当您在SelectMethod属性中添加或编辑值时,不会调用任何编译器,因此不会引发错误或警告。

在我们找到的ObsolteAttribute的说明中:

  

使用变通方法消息和布尔值初始化ObsoleteAttribute类的新实例,该值指示过时元素用法是否被视为错误。

键在这里是用法这个词。当该方法以声明性和/或后期绑定方式使用时,编译器无法检测到它的用法,因此不会引发错误。该方法仍然编译并存在于程序集中。不会引发运行时异常。

ObjectDataSource实例使用反射来调用该方法。在它的内部深处,你会发现这(简化):

Type type = this.GetType(this.TypeName);
MethodInfo method = type.GetMethod(this.SelectMethod, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
objectDataSourceResult = method.InvokeMethod(this, null);

它基本上在运行时查找方法并调用它。您甚至可以在运行时更改SelectMethod的值,代码仍然有效。编译程序集后,不会考虑过时的属性。