C# 公开在基库中定义的枚举类型
我正试图修改我的日志库。这就是我被困的地方。我使用一个枚举,我们称之为ActionType,来标识我的操作,如UserLogin、PurchaseOrder。。。成百上千。我在我的记录器方法中使用这种类型。但是,由于为了松耦合,我将记录器库与项目特定代码分离,并且基本库无法访问项目中定义的ActionType,因此我如何实现这一点。为了澄清这一点,让我用java解释同样的情况。Java允许枚举实现接口。所以我可以写: 在基本记录器库中,我可以定义C# 公开在基库中定义的枚举类型,c#,interface,enums,C#,Interface,Enums,我正试图修改我的日志库。这就是我被困的地方。我使用一个枚举,我们称之为ActionType,来标识我的操作,如UserLogin、PurchaseOrder。。。成百上千。我在我的记录器方法中使用这种类型。但是,由于为了松耦合,我将记录器库与项目特定代码分离,并且基本库无法访问项目中定义的ActionType,因此我如何实现这一点。为了澄清这一点,让我用java解释同样的情况。Java允许枚举实现接口。所以我可以写: 在基本记录器库中,我可以定义 公共接口IActionType{} 在我的几个项
公共接口IActionType{}
在我的几个项目中
public enum ActionType实现IActionType{UserLogin,PurchaseOrder,…}
因此,当我调用我的logger.log(ActionType.UserLogin,…)时,
base库将获得底层操作。这就足够了。在c#中是否有实现这一点的方法?顺便说一下,我考虑过使用IoC容器,但我想要更优雅的
非常感谢您的帮助……以下是log4net用于
级别
类的方法(是的,它是类,不是枚举):
和接口
public interface IActionType
{
int Value { get; }
string Name { get; }
}
用法:
logger.Log(ActionType.UserLogin);
下面是另一种使用泛型的方法:
public void Log<EnumType>(EnumType enumMember)
{
var name = enumMember.ToString();
int value = (int)(object)enumMember;
Console.WriteLine(name + " = " + value);
}
Lazy打败了我,但无论如何我都会发布我的解决方案
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);
}
相关:。简言之,C#enum比Java enum简单得多,因此您可能需要切换到固定数量的静态实例(也称为旧Java enum样式)。因此,您希望记录器和基本库都引用共享枚举,但不互相引用?这是对问题的准确描述吗?是的。实际上,我想在我的基本库中定义枚举,并尝试在许多不同的项目中填充它。这就是为什么我给出了java示例。你是否考虑过一个“核心”项目,你的记录器和库可以共享它?这可以包含枚举,记录器和库都可以引用。细节:在实例构造函数中有一个词
Log<ActionType>(ActionType.UserLogin);
Log<ActionType>(ActionType.PurchaseOrder);
UserLogin = 0
PurchaseOrder = 1
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);
}