向所有公共方法添加默认行为

本文关键字:添加 默认 方法 | 更新日期: 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 ...
}