【问题标题】:How to transform a string to a Definition of an Object如何将字符串转换为对象的定义
【发布时间】:2021-07-12 16:53:10
【问题描述】:

我想避免复制/粘贴 4 次相同的操作,只更改字节(x0.Rx0.G 等每种颜色)。
我不确定在 C# (.NET 3) 中是否可行,但我知道不同语言中存在类似的东西(使用方法 "something".to_sym 的 ruby​​)。

我这里的代码有一个本地方法Blend(string color)x0x1Color 对象,当我调用 x0.R 对应于红色时返回一个字节,x0.G 对应于绿色等。
我试图让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);
}

【问题讨论】:

    标签: c# .net xna monogame


    【解决方案1】:

    我认为你会得到最接近的是这样的:

    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));
    }
    

    至少我不知道代表选择属性的更短形式。像Blend(_.R) 这样的东西会很好。

    所以我认为这是你最好的选择,除非你想开始进行一些反思,但这会增加复杂性而收效甚微。

    【讨论】:

    • 好的,谢谢。我看到它既不容易也不短。我想我会坚持我的复制/粘贴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2013-05-08
    • 2011-05-02
    • 2013-12-10
    • 2018-07-19
    • 2013-06-16
    相关资源
    最近更新 更多