C# 使用二进制或For FontStyles的枚举标志的动态数量 我正在开发一个应用程序中的特性,允许用户保存他们首选的字体(家庭、大小、下划线、粗体或斜体)。首先,我应该说,我在开发或二进制或构造函数的最初几年中没有太多使用枚举,因此我在这方面的知识很薄弱

C# 使用二进制或For FontStyles的枚举标志的动态数量 我正在开发一个应用程序中的特性,允许用户保存他们首选的字体(家庭、大小、下划线、粗体或斜体)。首先,我应该说,我在开发或二进制或构造函数的最初几年中没有太多使用枚举,因此我在这方面的知识很薄弱,c#,dynamic,fonts,enums,C#,Dynamic,Fonts,Enums,正如许多人所知,设置新字体很简单 Font font = new Font("Arial", FontStyle.Bold | FontStyle.Underline); 我的问题是,是否有一种干净的方法将下划线、粗体或斜体的任意一种组合传递到构造函数中,而这些组合可能不是它们中的任何一种,可能只是粗体、粗体或斜体,等等 对我来说,清洁就是不必做这样的事情 if(myFont.Bold || myFont.Underline || myFont.Italic) { font = new

正如许多人所知,设置新字体很简单

Font font = new Font("Arial", FontStyle.Bold | FontStyle.Underline);
我的问题是,是否有一种干净的方法将下划线、粗体或斜体的任意一种组合传递到构造函数中,而这些组合可能不是它们中的任何一种,可能只是粗体、粗体或斜体,等等

对我来说,清洁就是不必做这样的事情

if(myFont.Bold || myFont.Underline || myFont.Italic)
{
    font = new Font("Arial", FontStyle.Bold | FontStyle.Underline | FontStyle.Italic);
}
else if(myFont.Bold || myFont.Underline)
{
    font = new Font("Arial", FontStyle.Bold | FontStyle.Underline);
}
else if(myFont.Bold || myFont.Italic)
{
    font = new Font("Arial", FontStyle.Bold | FontStyle.Italic);
}

。。。以此类推

不能有多个具有相同签名的构造函数,因此这是一个非起始构造函数,除非人为创建伪参数来区分它们


相反,您应该创建不同的静态方法,例如静态MyClass CreateBoldItalic(),每种组合一个。然后,它们将使用您选择的组合实例化该类。

您可以执行以下操作:

string fontName = "Arial";
FontStyle style = FontStyle.Regular;

if (myFont.Bold)
    style |= FontStyle.Bold;

if (myFont.Underline)
    style |= FontStyle.Underline;

if (myFont.Italic)
    style |= FontStyle.Italic;

Font font = new Font(fontName, style);

你可以这样做。使用此超负荷或任何适合您的

Font myFont = ...;//get your font
Font font = new Font("Arial", myFont.Size, myFont.Style);

你认为什么是干净的?我不清楚。您希望编写什么样的代码?Clean to me将不必使用逻辑来确定我需要的字体样式的数量,并为这三种字体样式的组合创建7个不同的构造函数。您的问题是关于序列化的吗?您是否在询问如何保存字体并将其检索回来?我猜。无法理解您的问题。不,我的问题是当字体可以是粗体或非粗体、下划线或斜体或非斜体时,如何设置字体对象。我编辑了原始问题,希望能让事情变得更清楚。仅供参考,这些逻辑运算符应该是|=而不是&=@RogerN谢谢,我刚刚意识到了这一点。