Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 公开在基库中定义的枚举类型_C#_Interface_Enums - Fatal编程技术网

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

C# 公开在基库中定义的枚举类型,c#,interface,enums,C#,Interface,Enums,我正试图修改我的日志库。这就是我被困的地方。我使用一个枚举,我们称之为ActionType,来标识我的操作,如UserLogin、PurchaseOrder。。。成百上千。我在我的记录器方法中使用这种类型。但是,由于为了松耦合,我将记录器库与项目特定代码分离,并且基本库无法访问项目中定义的ActionType,因此我如何实现这一点。为了澄清这一点,让我用java解释同样的情况。Java允许枚举实现接口。所以我可以写: 在基本记录器库中,我可以定义 公共接口IActionType{} 在我的几个项

我正试图修改我的日志库。这就是我被困的地方。我使用一个枚举,我们称之为ActionType,来标识我的操作,如UserLogin、PurchaseOrder。。。成百上千。我在我的记录器方法中使用这种类型。但是,由于为了松耦合,我将记录器库与项目特定代码分离,并且基本库无法访问项目中定义的ActionType,因此我如何实现这一点。为了澄清这一点,让我用java解释同样的情况。Java允许枚举实现接口。所以我可以写:

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

公共接口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示例。你是否考虑过一个“核心”项目,你的记录器和库可以共享它?这可以包含枚举,记录器和库都可以引用。细节:在实例构造函数中有一个词类< /C>太多。然后静态构造函数需要括号。首先,非常感谢。这将很好地解决我的问题。其次,我很好奇这是否会导致性能问题,因为我将为我的1000个操作中的每一个定义1000个类?我认为1000不是那么多,是吗?@dopache好吧,这些对象只会创建一次,并且需要大约4Kb的内存(如果只使用Value属性),谢谢您的关注:)
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);
}