是否有一个简单的属性或数据契约,我可以分配给一个函数参数,以防止null在C#/ .NET中传递?理想情况下,这也会在编译时进行检查,以确保文本null在任何地方都没有被使用,并且在运行时抛出ArgumentNullException.
目前我写的东西像......
if (null == arg)
throw new ArgumentNullException("arg");
Run Code Online (Sandbox Code Playgroud)
......对于我期望不存在的每一个论点null.
在同一个注释中,是否Nullable<>会出现以下情况:
NonNullable<string> s = null; // throw some kind of exception
Run Code Online (Sandbox Code Playgroud) 让我用下面的例子来解释我的问题:
public string ExampleFunction(string Variable) {
return something;
}
string WhatIsMyName = "Hello World"';
string Hello = ExampleFunction(WhatIsMyName);
Run Code Online (Sandbox Code Playgroud)
当我将变量"WhatIsMyName"传递给示例函数时,我希望能够获取原始变量名称的字符串.也许是这样的:
Variable.OriginalName.ToString()
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
我有一组扩展方法,我经常用于各种UI任务.我通常将它们定义为运行类型object,即使在它们内部我通常将它们转换为字符串类型.
public static string FormatSomething(this object o)
{
if( o != null )
{
string s = o.ToString();
/// do the work and return something.
}
// return something else or empty string.
}
Run Code Online (Sandbox Code Playgroud)
我使用类型object而不是使用类型的主要原因string是<%#Eval("Phone").ToString().FormatSomething()%>在我可以做的时候将自己保存在UI中<%#Eval("Phone").FormatSomething()%>.
那么,从性能的角度来看,创建所有扩展方法是否正常object,或者我应该根据扩展方法的作用将它们转换为string(或相关)类型?
可能重复:
查找传递给C#中函数的变量名称
在C#中,有没有办法(更好的方法)在运行时解析参数的名称?
例如,在以下方法中,如果重命名方法参数,则还必须记住更新传递给ArgumentNullException的字符串文字.
public void Woof(object resource)
{
if (resource == null)
{
throw new ArgumentNullException("resource");
}
// ..
}
Run Code Online (Sandbox Code Playgroud) 我注意到这个代码在我的构造函数中出现了很多:
if (someParam == null) throw new ArgumentNullException("someParam");
if (someOtherParam == null) throw new ArgumentNullException("someOtherParam");
...
Run Code Online (Sandbox Code Playgroud)
我有一些构造函数,其中注入了几个东西,并且必须都是非null.谁能想到一种简化这种方法的方法?我唯一能想到的是以下几点:
public static class ExceptionHelpers
{
public static void CheckAndThrowArgNullEx(IEnumerable<KeyValuePair<string, object>> parameters)
{
foreach(var parameter in parameters)
if(parameter.Value == null) throw new ArgumentNullException(parameter.Key);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用它会是这样的:
ExceptionHelper.CheckAndThrowArgNullEx(new [] {
new KeyValuePair<string, object>("someParam", someParam),
new KeyValuePair<string, object>("someOtherParam", someOtherParam),
... });
Run Code Online (Sandbox Code Playgroud)
...这并没有真正帮助简化代码.Tuple.Create()而不是KVP不起作用,因为Tuple的GTP不协变(即使IEnumerable的GTP是).有任何想法吗?