在C#中是否可以实现一种机制,该机制会自动将默认行为添加到给定类的每个公共方法(实现给定的接口或给定属性..或其他)?
例如,我有一个方法:
public void DoSomething(MyClass a) {
if (a != null) {
// Do method body
}
else{
// Throw exception (a argument of type MyClass is null)
}
}
我希望为每个属性自动添加这个条件,而不需要每次为给定的公共方法编写它。
我可以用什么(任何一种机制)来做类似的事情吗?
答案 0 :(得分:2)
为避免反射,您可以使用通用方法:
public void DoSomething(MyClass a) => MakeSomeStaff(a, () => { /* Do method body */ });
private void MakeSomeStaff<T>(T item, Action action) where T: class
{
if (item == null)
throw new Exception();
action();
}
答案 1 :(得分:1)
编辑:有一个滥用运算符重载的想法,底层的原始答案: 使用运算符重载来抛出null
public struct Some<T> where T : class {
public T Value { get; }
public Some(T value)
{
if (ReferenceEquals(value, null))
throw new Exception();
Value = value;
}
public override string ToString() => Value.ToString();
public static implicit operator T(Some<T> some) => some.Value;
public static implicit operator Some<T>(T value) => new Some<T>(value);
}
private void DoThingsInternal(string foo) =>
Console.Out.WriteLine($"string len:{foo.Length}");
public void DoStuff(Some<string> foo)
{
DoThingsInternal(foo);
string fooStr = foo;
string fooStrBis = foo.Value;
// do stuff
}
原始回答 您可以使用扩展方法为您投掷
public static class NotNullExt{
public static T Ensure<T>(this T value,string message=null) where T:class
{
if(ReferenceEquals(null,value) throw new Exception(message??"Null value");
return value;
}
}
public void DoSomething(MyClass a) {
a=a.Ensure("foo");
// go ...
}