c# - 在 C# 中将类成员引用为枚举

标签 c# .net reflection metadata

有没有办法将类“成员”作为一等值传递?

public class Bike {
    public Color BikeColour { get; set; }
    public bool  IsGirlsBike { get; set; }
}

然后我想引用字段名称,而没有任何对象的概念。

我想我想要的是类似枚举的东西:

public enum BikeFields {BikeColour, IsGirlsBike};

但没有明确定义。

有没有办法在 C# 中执行此操作?

编辑:抱歉含糊不清;我希望能够将类成员称为一流事物(几乎像绑定(bind)类型)。

Set<Bike:T> whichFieldsHaveBeenDrawn = new Set<Bike:T>();

Bike:T 是未定义的,我希望下面的插图能清楚地说明这种新类型将如何工作。

whichFieldsHaveBeenDrawn.Include(Bike.BikeColour);

var remainingFields = Set.Subtract(Bike.GetAllFields(), whichFieldsHaveBeenDrawn);

Bike b = new Bike();
foreach (var field in remainingFields) { Draw(field, b); }

我想我可以用反射来做到这一点,但我希望它们在编译时合格......

最佳答案

你不能同时拥有静态类型的枚举和类,因为它们是在同一步骤中编译的。所以你需要两个步骤,首先是拥有类,然后是生成相应的枚举。分两步实现此目的的一种方法是使用像这样的 t4 模板:

1. 创建一个类库(假设称为 ClassLibrary)。这将包含您的 Bike 类。

2. 在控制台应用程序(或您可能需要的任何其他类型的项目)中添加一个 t4 文本模板,如下所示:

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="$(TargetDir)\ClassLibrary.dll" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="ClassLibrary" #>
<#@ output extension=".generated.cs" #>

namespace SO_31801914
{

<#
    var classes = new Type[] { typeof(ClassLibrary.Bike) };

    foreach (var cls in classes)
    {
#>
    public enum <#=cls.Name#>Enum
    {
<#      var props = cls.GetProperties();        
        for (int i = 0 ; i < props.Length; i++)
        {
            var prop = props[i];
            bool skipComma = false;
            if (i == props.Length - 1)
            {
                skipComma = true;
            }
#>
            <#=prop.Name#><#=skipComma ? string.Empty : ","#>
<#
        }
#>
    }
<#
    }
#>
}

结果将是:

namespace SO_31801914
{

    public enum BikeEnum
    {
        BikeColour,
        IsGirlsBike
    }
}

构建类库,然后右键单击模板并单击“运行自定义工具”。在 TemplateName.generated.cs 中,您将获得上述结果。

关于c# - 在 C# 中将类成员引用为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31801914/

相关文章:

c# - 如何将子菜单项添加到菜单项

C# EPPLUS 无法获取单元格值

c# - C# 中的 LINQ 查询和子查询枚举计数?

java - 访问Java中父类的每个子类

c# - 如何使用 Entity Framework 6 通过 IN 语句执行原始 sql

c# - Azure 表中的异步插入

c# - 如何在 ASP.NET MVC 中拥有一个文件扩展名会被请求过滤阻止的路由

java - 将未知类型泛型列表转换为数组

c# - 正确区分bool?和 bool 在 C#

c# - 如何抑制所有类型成员的代码分析消息?