2013-11-25 30 views
6

为了减少冗余代码,我有一些罚球的辅助方法:思考扔助手

protected static X ThrowInvalidOperation(string operation, X a, X b) { 
    throw new InvalidOperationException("Invalid operation: " + a.type.ToString() + " " + operation + " " + b.type.ToString()); 
} 

用法:

public static X operator +(X a, X b) { 
     if (...) { 
      return new X(...); 
     } 
     return ThrowInvalidOperation("+", a, b); 
    } 

问题:由于运营商+必须返回一个值,我通过使ThrowInvalidOperation返回一个值并将其与returnThrowInvalidOperation("+", a, b);

有很多缺点 - 一个是因为我不能从返回不同类型的方法调用它。
我希望有一种方法可以标记助手函数“总是抛出异常”,因此编译器会停止跟踪返回值。

问:我有什么可能做这项工作?

+1

你有没有考虑在助手中创建异常,同时将它抛入运算符实现?例如。 '抛出NewInvalidOperationException(...);' – Caramiriel

回答

6

使异常:

protected static Exception MakeInvalidOperation(string operation, X a, X b) 
{ 
    return new InvalidOperationException(
     "Invalid operation: " + a.type + " " + operation + " " + b.type); 
} 

然后把它:

throw MakeInvalidOperation("+", a, b); 

你在好公司:

// Type: Microsoft.Internal.Web.Utils.ExceptionHelper 
// Assembly: WebMatrix.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
// MVID: 3F332B40-45DB-42E2-A4ED-0826DE223A79 
// Assembly location: C:\Windows\Microsoft.NET\assembly\GAC_MSIL\WebMatrix.Data\v4.0_1.0.0.0__31bf3856ad364e35\WebMatrix.Data.dll 

using System; 

namespace Microsoft.Internal.Web.Utils 
{ 
    internal static class ExceptionHelper 
    { 
     internal static ArgumentException CreateArgumentNullOrEmptyException(string paramName) 
     { 
      return new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, paramName); 
     } 
    } 
} 

虽然它不是多的代码来写你的自己定制的Exception型(或基于InvalidOperationException的)和def在某些构造函数中为您设置一条消息。

为了减少冗余代码

当我听到这个,我觉得AOP这是由PostSharp执行得非常好。如果你有很多冗余的代码,你应该考虑AOP,但是要记住它可能是矫枉过正的。

+1

只有两种可能性:我太傻了我的工作*或*我做了这项工作太久 - 解决方案很简单... – joe

+0

@joe那么怎么样第三个相互包容的解决方案? :) –

+1

@taspeotis:你说得对 - 这些日子更好不要离开家 – joe