Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net web表单页代码隐藏的扩展方法存在问题_C#_Asp.net_Webforms_Ado - Fatal编程技术网

C# asp.net web表单页代码隐藏的扩展方法存在问题

C# asp.net web表单页代码隐藏的扩展方法存在问题,c#,asp.net,webforms,ado,C#,Asp.net,Webforms,Ado,我正在创建一个扩展方法,用c#检查null datarow,我试图在我的asp.net web表单代码中使用该扩展方法,但告诉我该方法在当前上下文中不为空 这是我正在尝试的代码 public static class IsNullValidator { public static bool IsNullEquivalent( this object value) { return value == null

我正在创建一个扩展方法,用c#检查null datarow,我试图在我的asp.net web表单代码中使用该扩展方法,但告诉我该方法在当前上下文中不为空 这是我正在尝试的代码

 public static class IsNullValidator
    {
        public static bool IsNullEquivalent( this object value)
        {
            return value == null
                   || value is DBNull
                   || string.IsNullOrWhiteSpace(value.ToString());
        }
        public static bool IsEmpty( this DataRow row)
        {
            return row == null || row.ItemArray.All(i => i.IsNullEquivalent());
        }
    }
我这样称呼它

DataRow[] row =getRowMethod();
if IsEmpty(row){"do some functionality"}
   public static bool IsEmpty(  DataRow row)
            {
                return row == null || row.ItemArray.All(i => i.IsNullEquivalent());
            }
   if IsEmpty(row[0]){"do some functionality"}
如果我通过将这个关键字删除到下面来更改IsEmpty签名,它的工作原理如下

DataRow[] row =getRowMethod();
if IsEmpty(row){"do some functionality"}
   public static bool IsEmpty(  DataRow row)
            {
                return row == null || row.ItemArray.All(i => i.IsNullEquivalent());
            }
   if IsEmpty(row[0]){"do some functionality"}
我需要使用这个扩展来检查任何datarow,将来还要检查任何datatable 我可以使用下面的方法检查空数据表吗

 public static bool IsEmptyDatatable (DataTable dt)
    {
        return dt == null || dt.Rows.Cast<DataRow>().Where(r=>r.ItemArray[0]!=null).All(i => i.IsNullEquivalent());
    }
publicstaticboolsemptydatatable(DataTable dt)
{
返回dt==null | | dt.Rows.Cast()。其中(r=>r.ItemArray[0]!=null)。All(i=>i.IsNullEquivalent());
}
扩展方法是某种类型的“扩展”。在本例中,您正在扩展
DataRow
类。对于扩展方法,您需要该类的实例来调用它,例如:

DataRow[] row =getRowMethod();

if row.IsEmpty(){"do some functionality"}
在本例中,对
DataRow
类的实例
row
调用扩展方法


如果你认为
this
关键字是说“这个方法可以在'this'类的实例上调用”——在你的例子中是
DataRow
,这可能会帮助你理解它。

最后,我给出了下面的解决方案,谢谢大家……所有你的建议都很有帮助

 public static bool IsNullEquivalent( this object value)
        {
            return value == null
                   || value is DBNull
                   || string.IsNullOrWhiteSpace(value.ToString());
        }
        public static bool IsEmptyDataRow(this  DataRow row)
        {
            return row == null || row.ItemArray.All(i => i.IsNullEquivalent());
        }
        public static bool IsEmptyDatatable (this DataTable dt)
        {
            return dt == null || dt.Rows.Cast<DataRow>().All(i => i.IsEmptyDataRow());
        }
publicstaticbool IsNullEquivalent(此对象值)
{
返回值==null
||值为DBNull
||IsNullOrWhiteSpace(value.ToString());
}
公共静态布尔值IsEmptyDataRow(此DataRow)
{
返回row==null | | row.ItemArray.All(i=>i.IsNullEquivalent());
}
公共静态布尔ISEMPTYDATABLE(此数据表dt)
{
返回dt==null | | dt.Rows.Cast().All(i=>i.IsEmptyDataRow());
}

当出现这种类型的问题时,我通常会使用temproary变量将代码分成多行。这样我就可以依次调试每个操作部件并获得正确的异常消息。关于性能没有什么可担心的。JiT编译器完全能够剪切未充分使用的变量。如果有的话,那往往是好事。即使有,代码的可读性和可调试性也可能会超过这一点。我使用的是c#编译器而不是jit,并且在非运行时编码时调用方法的问题在接近CPU之前,实时编译器由运行时在MSIL上运行。所以它完全适用于这里。这就是您不使用扩展方法的原因。如果它是一个扩展方法,那么应该像
行[0].IsEmpty()那样调用它。这就是为什么它被称为扩展方法,因为它用一个新方法扩展了一个类型。您只需确保使用
语句导入的静态类是正确的
。是的,正如@Jacob提到的,如果
行[0],我将其更改为下面的值。IsEmpty(){“Dosome function”}
,并且它可以工作,但是仍然面临检查null datatable的第二个问题,我最终得到了这个公共静态bool IsEmptyDatatable(this datatable dt)
{return dt==null | | dt.Rows.Cast().All(i=>i.IsEmptyDataRow());}