C# asp.net web表单页代码隐藏的扩展方法存在问题
我正在创建一个扩展方法,用c#检查null datarow,我试图在我的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
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());}