如何存储对属性的引用

时间:2013-05-13 00:17:22

标签: c# properties reference

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

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.
}

我希望这可以帮助你多一点帮助......

3 个答案:

答案 0 :(得分:2)

假设我正确理解您的需求,您可以使用Action<>委托来设置您的属性。以下示例代码(在Windows窗体应用程序中)使用Dictionary来存储每个单选按钮的委托。单选按钮都共享相同的事件处理程序,它从字典中检索委托并将其设置为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; }
}

答案 1 :(得分: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语句。

如果您对此类技术感兴趣,我建议您阅读Strategy PatternCommand Pattern也似乎正在出现。

答案 2 :(得分:-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; } 
}