3

有没有办法将一个属性的引用存储到一个变量中,让我可以像访问该对象属性一样访问它,如下所示:

var ReferenceVariable = Object.Property;
ReferenceVariable = "SOMETHING";
If (Object.Property == "SOMETHING")
    //It worked! Yaay!

如果是这样,我该怎么做?

编辑:为了清楚起见,这就是发生的事情:

private void UpdateColor(){
    if (radioButton1.Checked){
        Object.Color1 = Color.Red
    }
    if (radioButton2.Checked){
        Object.Color2 = Color.Blue
    }
    .
    .
    .
    if (radioButtonN.Checked){
        Object.ColorN = Color.ColorN
    }
}

这是非常次优的。理想情况下,该问题将在单选按钮更改时触发的函数中处理,因此它类似于...

private void RadioButton_CheckChanged(object sender, eventargs e){
    //Something is done here to tell the program that we are interested in Object.Color...Whatever
}

private void UpdateColor(){
    //Now we know what color we're looking at, we can just do it in one step rather than looking at a thousand (I exaggerate of course) radio buttons checked states.
}

我希望这能帮助你更多地帮助我......

4

3 回答 3

2

假设我正确理解您的需求,您可以使用Action<>委托来设置您的属性。以下示例代码(在 Windows 窗体应用程序中)使用 aDictionary来存储每个单选按钮的委托。单选按钮都共享相同的事件处理程序,该处理程序从字典中检索委托并将其设置为colorSetter变量中的当前委托。我只是使用表单上的一些按钮来更改颜色,并且根据选中的单选按钮,将更改相应的颜色属性。

public partial class Form1 : Form {
    private readonly ColorPropertyObject cpo = new ColorPropertyObject();
    private Action<Color> colorSetter;

    private readonly Dictionary<RadioButton, Action<Color>> setterDictionary =
        new Dictionary<RadioButton, Action<Color>>();


    public Form1() {
        InitializeComponent();
        setterDictionary.Add(radioButton1, c => cpo.Color1 = c);
        setterDictionary.Add(radioButton2, c => cpo.Color2 = c);
        setterDictionary.Add(radioButton3, c => cpo.Color3 = c);
    }


    private void radioButton1_CheckedChanged(object sender, EventArgs e) {
        colorSetter = setterDictionary[(RadioButton)sender];
    }


    private void button1_Click(object sender, EventArgs e) {
        colorSetter(Color.Blue);
    }


    private void button2_Click(object sender, EventArgs e) {
        colorSetter(Color.Black);
    }


    private void button3_Click(object sender, EventArgs e) {
        colorSetter(Color.Red);
    }


    private void button4_Click(object sender, EventArgs e) {
        Console.WriteLine(cpo.Color1 + " - " + cpo.Color2 + " - " + cpo.Color3);
    }
}

public class ColorPropertyObject {
    public Color Color1 { get; set; }
    public Color Color2 { get; set; }
    public Color Color3 { get; set; }
}
于 2013-05-13T02:11:35.053 回答
0

快速回答问题:

有没有办法将一个属性的引用存储到一个变量中,让我可以像访问该对象属性一样访问它?

C# 不是一种支持传递和保持对属性的引用的语言。某些语言可能支持这一点,但 C# 不是其中之一。您当然可以引用属性引用的同一个对象,并对它的持有状态进行任何支持的突变,但是如果以后想要完全覆盖属性值(基本上:重新分配,如您的示例所示),您将需要保持对拥有该属性的对象的引用。


现在也许可以帮助解决您的问题。

您可能会探索根据用户输入更改策略的想法。以最简单的形式,你可能只是改变颜色,那么这种模式可能不会让你得到太多。但是,如果您改为更改颜色,也许编写一些自定义文本,并向毫无戒心的橡胶蚂蚁发射激光,那么包含这些策略的类可以封装更高程度的复杂性,您可以简单地在它们之间切换(或激活一个)根据选择。

这些策略可以表示为符合给定接口的类,或者它们可以只是委托。您可以自行决定什么对您的特定项目最有意义。

需要明确的是,在您的单选按钮事件处理程序中,您确定了您希望采用的策略。此策略知道如何处理您的对象。

myStrategy = redStrategy; // Func, Action, class instance as applicable

如果您的策略简单地表示为Action<...>,它可能类似于

Action redStrategy = () => 
{
    obj.Color1 = Color.Red;
    obj.Text1 = "Red selected";
    obj.BurnRedRubberAnts();
}

在您的更新方法中,您只需使用任何适用的参数(上面未定义)调用预先确定的策略并让它执行。

myStrategy(/* args */)

您可以更改它以接受参数、返回值(使用Func而不是Action),或者成为完全开发和可测试的类。或者所有这些对于您想要做的事情都可能被证明是矫枉过正的,在这种情况下,您可以只使用您试图避免的 switch 语句。

如果您对此类技术感兴趣,我建议您阅读有关策略模式的内容,并且命令模式似乎也正在兴起。

于 2013-05-13T01:45:57.760 回答
-1
    static void Main(string[] args)
    {
        var props = typeof(MyClass).GetProperties();
        foreach (var propertyInfo in props)
        {
            if (propertyInfo.Name == "property")
            {
                var prop = propertyInfo;
            }
        }
    }
}

class MyClass
{
    public static string property { get; set; } 
}
于 2013-05-13T00:26:45.940 回答