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

时间:2016-07-12 10:31:42

标签: c# .net

在C#中是否可以实现一种机制,该机制会自动将默认行为添加到给定类的每个公共方法(实现给定的接口或给定属性..或其他)?

例如,我有一个方法:

    public void DoSomething(MyClass a) {
       if (a != null) {
          // Do method body
       }
       else{
          // Throw exception (a argument of type MyClass is null)
       }
    }

我希望为每个属性自动添加这个条件,而不需要每次为给定的公共方法编写它。

我可以用什么(任何一种机制)来做类似的事情吗?

2 个答案:

答案 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 ...
}