有没有办法将类“成员”作为一流值传递?
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); }
我想我可以通过反射来做到这一点,但我希望它们在编译时合格......
最佳答案
您不能在一个类中同时使用静态类型的 Enum,因为它们是在同一步骤中编译的。所以你需要两个步骤,第一个是拥有类,然后是生成相应的 Enum。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .分两步实现这一目标的一种方法是使用 t4 模板,如下所示:
1. 创建一个类库(假设称为 ClassLibrary)。这将包含您的自行车类(class)。
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
}
}
构建 ClassLibrary 然后右键单击模板并单击“运行自定义工具”。在
TemplateName.generated.cs
中,您将获得上述结果。关于c# - 在 C# 中将类成员称为枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31801914/