我试图修改我的日志库。这就是我被困住的地方。我使用一个枚举,让我们称之为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