有没有办法将属性的引用存储到一个允许我访问它的变量中,就像我访问那个对象属性一样,如下所示:
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.
}
我希望这可以帮助你多一点帮助......
答案 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 Pattern,Command 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; }
}