7

我正在尝试修改我的日志库。这是我卡住的地方。我使用枚举,我们称之为 ActionType,来识别我的操作,如 UserLogin、PurchaseOrder ......数百个。我在我的记录器方法中使用这种类型。但是由于我为了松散耦合而将我的记录器库与我的项目特定代码分开,并且基础库无法访问项目中定义的 ActionType,我该如何实现这一点。为了澄清它,让我解释一下java中的相同情况。Java 允许枚举实现接口。所以我可以写:

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

public interface IActionType {}

在我的几个项目之一中

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

所以当我调用我的 logger.log(ActionType.UserLogin, ....)基础库时会得到底层的操作。这一切就足够了。无论如何,它周围有没有在 c# 中完成这个?顺便说一句,我考虑过使用 IoC 容器,但我想要更优雅的东西。

非常感谢您的帮助...

4

3 回答 3

3

这是 log4net 用于Level类的方法(是的,它是类,而不是枚举):

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);
于 2013-01-11T21:34:03.057 回答
3

懒惰打败了我,但无论如何我都会发布我的解决方案

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);
}
于 2013-01-11T22:07:27.270 回答
1

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

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
于 2013-01-11T22:04:25.083 回答