公开基库中定义的枚举类型



我试图修改我的日志库。这就是我被困住的地方。我使用一个枚举,让我们称之为ActionType,来标识我的操作,如UserLogin, PurchaseOrder…好几百个。我在记录器功能中使用这个类型。但是,由于我将日志库从项目特定的代码中分离出来是为了松耦合,并且基库不能访问项目中定义的ActionType,我该如何实现这一点呢?为了澄清它,让我解释一下java中的相同情况。Java允许枚举实现接口。所以我可以写:

在基本记录器库中,我可以定义;

public interface IActionType {}

和我的一个项目

public enum ActionType implements IActionType {UserLogin, PurchaseOrder, .....}

所以当我调用我的 logger.log(ActionType.UserLogin, ....)基库时会得到底层的动作。这些就足够了。在c#中是否有其他方法可以实现这一点?顺便说一下,我考虑过使用IoC容器,但我想要一些更优雅的东西。

这是log4net使用Level类(是的,它是类,而不是enum)的方法:

public class ActionType : IActionType
{
   public static readonly ActionType UserLogin;
   public static readonly ActionType PurchaseOrder;
   static ActionType()
   {
       UserLogin = new ActionType(1, "User Login");
       // ...
   }
   public ActionType(int value, string name)
   {           
       // verify arguments values
       Value = value;
       Name = name;
   }
   public int Value { get; private set; }
   public string Name { get; private set; }
}

和接口

public interface IActionType
{
    int Value { get; }
    string Name { get; }
}

用法:

logger.Log(ActionType.UserLogin);

懒惰的我打败了它,但我还是要张贴我的解决方案

public void MyUsage(ITypesafeEnum myEnum)
{
    Console.WriteLine(myEnum.Name);
    Console.WriteLine(myEnum.Val);
}
public interface ITypesafeEnum{
    string Name{get;}
    int Val {get;}
}
public  class TypesafeEnum:ITypesafeEnum{
    public string Name {get;private set;}
    public int Val {get;private set;}
    private TypesafeEnum(){}
    private TypesafeEnum(string name, int val){
        Name = name;
        Val = val;
    }
    public static readonly TypesafeEnum Bedroom = new TypesafeEnum("Bedroom", 1);
    public static readonly TypesafeEnum LivingRoom = new TypesafeEnum("Living Room",2);
}

下面是另一种使用泛型的方法:

public void Log<EnumType>(EnumType enumMember)
{
    var name = enumMember.ToString();
    int value = (int)(object)enumMember;
    Console.WriteLine(name + " = " + value);
}

像这样调用上面的方法:

Log<ActionType>(ActionType.UserLogin);
Log<ActionType>(ActionType.PurchaseOrder);

的输出如下所示:

UserLogin = 0
PurchaseOrder = 1

相关内容

  • 没有找到相关文章

最新更新