如何将字符串转换为对象的定义
How to transform a string to a Definition of an Object
我想避免 copy/pasting 4 次相同的操作,只改变字节(x0.R
到 x0.G
等每种颜色)。
我不确定在 C# (.NET 3) 中是否可行,但我知道不同语言中存在类似的东西(ruby 使用方法 "something".to_sym
)。
我这里的代码有一个本地方法Blend(string color)
。 x0
和 x1
是 Color
对象,当我调用 x0.R
对应于红色,x0.G
对应于绿色等时 return 一个字节
我试图让 x0.color
工作成为可能,其中 color
是一个字符串,可以是 "R"
、"G"
、"B"
或 "A"
.
在 C# 中有没有办法将 x0."R"
转换为 x0.R
?
private static Color Interpolate(Color x0, Color x1, float alpha)
{
float Blend(string color)
{
float z = (float) x0.color / 255 * (1- alpha) + alpha * (float) x1.color / 255;
return z;
}
// float r = (float) x0.R / 255 * (1- alpha) + alpha * (float) x1.R / 255;
return new Color(Blend("R"),Blend("G"),Blend("B"),Blend("A"));
}
编辑:我找到了一种方法,完全按照我从对象 Color
(Xna,而不是 System.Drawings)中写的内容进行插值 2 种颜色:
private static Color Interpolate(Color x0, Color x1, float alpha)
{
return Color.Lerp(x0,x1,alpha);
}
我认为最接近的是这样的:
private static Color Interpolate(Color x0, Color x1, float alpha)
{
float Blend(Func<Color, byte> componentSelector)
{
float z = (float) componentSelector(x0) / 255 * (1 - alpha)
+ alpha * (float) componentSelector(x1) / 255;
return z;
}
return new Color(
Blend(x => x.R),
Blend(x => x.G),
Blend(x => x.B),
Blend(x => x.A));
}
至少我不知道 select a 属性 的委托的更短形式。像 Blend(_.R)
.
这样的东西会很好
所以我认为这是你最好的选择,除非你想开始反思,但这只会增加复杂性而收效甚微。
我想避免 copy/pasting 4 次相同的操作,只改变字节(x0.R
到 x0.G
等每种颜色)。
我不确定在 C# (.NET 3) 中是否可行,但我知道不同语言中存在类似的东西(ruby 使用方法 "something".to_sym
)。
我这里的代码有一个本地方法Blend(string color)
。 x0
和 x1
是 Color
对象,当我调用 x0.R
对应于红色,x0.G
对应于绿色等时 return 一个字节
我试图让 x0.color
工作成为可能,其中 color
是一个字符串,可以是 "R"
、"G"
、"B"
或 "A"
.
在 C# 中有没有办法将 x0."R"
转换为 x0.R
?
private static Color Interpolate(Color x0, Color x1, float alpha)
{
float Blend(string color)
{
float z = (float) x0.color / 255 * (1- alpha) + alpha * (float) x1.color / 255;
return z;
}
// float r = (float) x0.R / 255 * (1- alpha) + alpha * (float) x1.R / 255;
return new Color(Blend("R"),Blend("G"),Blend("B"),Blend("A"));
}
编辑:我找到了一种方法,完全按照我从对象 Color
(Xna,而不是 System.Drawings)中写的内容进行插值 2 种颜色:
private static Color Interpolate(Color x0, Color x1, float alpha)
{
return Color.Lerp(x0,x1,alpha);
}
我认为最接近的是这样的:
private static Color Interpolate(Color x0, Color x1, float alpha)
{
float Blend(Func<Color, byte> componentSelector)
{
float z = (float) componentSelector(x0) / 255 * (1 - alpha)
+ alpha * (float) componentSelector(x1) / 255;
return z;
}
return new Color(
Blend(x => x.R),
Blend(x => x.G),
Blend(x => x.B),
Blend(x => x.A));
}
至少我不知道 select a 属性 的委托的更短形式。像 Blend(_.R)
.
所以我认为这是你最好的选择,除非你想开始反思,但这只会增加复杂性而收效甚微。