向所有公共方法添加默认行为
本文关键字:添加 默认 方法 | 更新日期: 2023-09-27 17:56:26
是否可以
在C#中实现一种机制,该机制将自动将默认行为添加到给定类的每个公共方法(实现给定接口或具有给定属性..或其他什么)?
例如,我有一个方法:
public void DoSomething(MyClass a) {
if (a != null) {
// Do method body
}
else{
// Throw exception (a argument of type MyClass is null)
}
}
我希望为每个属性自动添加此条件,而无需每次为给定的公共方法编写它。
有什么(任何类型的机制)可以用来做这样的事情吗?
若要避免反射,可以使用泛型方法:
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();
}
编辑:有一个滥用运算符重载的想法,底部的原始答案:使用运算符重载抛出空值
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 ...
}