您是否可以使用带扩展方法的模板来破坏C#中的空检查?

ast*_*ght 9 c#

如果我想要一个子字符串,我可以做这样的事情:

myString.SubString(0,3); 
Run Code Online (Sandbox Code Playgroud)

但是现在代码需要空检查才能安全地调用SubString.所以我写了一个字符串扩展名.

public static string SafeSubString(this string input, int length)
{
  if (input == null)
    return null;
  if (input.Length > length)
    return input.Substring(0, length); 
  return input; 
}
Run Code Online (Sandbox Code Playgroud)

现在我可以编写myString.SafeSubString(3);并避免空检查.

我的问题是,是否可以使用带扩展的模板运算符,并以某种方式绕过对象方法中的空检查?

例如.

MyObj.AnyMethod()
Run Code Online (Sandbox Code Playgroud)

也许你可以用T替换字符串

像这附近的东西

static void Swap<T>(this T myObj, delegate method)
{
  if(myObj != null)
    method.invoke(); 
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 6

当然,Use如果你愿意,你可以制作类似方法的东西:

public static TResult Use<TSource, TResult>(
    this T obj, Func<TSource, TResult> function)
    where T : class
{
    return obj == null ? null : function(obj);
}
Run Code Online (Sandbox Code Playgroud)

你也可能想要一个用于void方法的方法:

public static void Use<T>(this T obj, Action<T> action)
    where T : class
{
    if(obj != null) action(obj);
}
Run Code Online (Sandbox Code Playgroud)

在诸如F#之类的语言中,可以使用monads来允许函数简单地将null传播到它们的结果,而不是抛出异常.在C#中它不是那么漂亮,语法明智.

不过,我对这些方法也有点担心.您基本上是"吞咽"空引用错误.在某些情况下,你可能会这样做,这是一个好的快捷方式,但要小心它,以确保你不要把自己置于一个调试的噩梦中,你无法弄清楚什么是null什么时候不应该.