Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对C中几个字符串之一的引用#_C#_String_Reference - Fatal编程技术网

C# 对C中几个字符串之一的引用#

C# 对C中几个字符串之一的引用#,c#,string,reference,C#,String,Reference,C#在VS2008、.NET2.0、Winforms应用程序中 我创建了一个小类,它的构造函数引用一个对象(由许多不同类型的数据字段组成)和一个“key”字符串,其中包含要更新的引用对象中的一个字符串成员的名称 在这个小类中,我得到了一个switch()语句,它检查“key”字符串的每个可能的合法值(可能是枚举类型,但不管怎样),在这里,我尝试分配一个单独的内部字符串变量,以指向引用对象中的相应字符串变量。稍后,其他代码会更新这个单独的内部变量,我需要更新引用对象中的相应变量以匹配 在C语言中,

C#在VS2008、.NET2.0、Winforms应用程序中

我创建了一个小类,它的构造函数引用一个对象(由许多不同类型的数据字段组成)和一个“key”字符串,其中包含要更新的引用对象中的一个字符串成员的名称

在这个小类中,我得到了一个switch()语句,它检查“key”字符串的每个可能的合法值(可能是枚举类型,但不管怎样),在这里,我尝试分配一个单独的内部字符串变量,以指向引用对象中的相应字符串变量。稍后,其他代码会更新这个单独的内部变量,我需要更新引用对象中的相应变量以匹配

在C语言中,我会写下如下内容:

char *p;
if (strcmp(pszKeyName, "FieldOne") == 0) {
    p = struct.string1;
} else if (strcmp(pszKeyName, "FieldTwo") == 0) {
    p = struct.string2;
} else if...
(请原谅语法;我从来都不太擅长指针。)我的想法是,我可以将strcpy()的内容输入到“p”中,然后,结构中相应的字符串变量(string1、string2等)将被更新以匹配

如何在C#.NET2.0中实现这一点

除此之外,它是非常简单的代码,我不想对任何东西进行子类化、重写、派生或重新创建。基本上,它是一个简单的类,表示一个文本问题和一对是/否复选框。它在Winforms TabControl/TabPage中用于显示带有预定文本的标签,并允许用户单击“是”或“否”来回答给定的问题文本。该类仅表示一组Label/CheckBox/CheckBox控件;有一个通过调用代码创建的列表。(是的,我会使用一个自定义控件来封装这三个控件,但是标签文本的垂直高度以及它的位置在设计时是未知的。尽管如此,这还是值得研究的。)

无论如何,在运行时,调用代码会根据同一个大型引用对象中的其他设置计算出需要多少这样的问题,并根据需要多次实例化这个小类。我已经弄清楚了所有屏幕上的位置,甚至在选中复选框时…\u CheckedChanged()处理程序也会启动


剩下的最后一个问题是,当调用我的“是”和“否”复选框处理程序时,它们不知道要将单词“是”或“否”写入被引用对象的几个数据成员中的哪一个。

添加对
系统的引用。反射
,然后尝试以下操作:

public void SetStringValue(object o, String propertyName, String newValue)
{
    try
    {
        o.GetType().GetProperty(propertyName).SetValue(o, newValue, null);
    }
    catch (Exception ex)
    {
        throw new Exception(String.Format("Failure setting property {0}!", propertyName), ex);
    }
}

这个答案可能是正确的,但是在这样一个简单的场景中必须使用反射是潜在设计问题的一个标志。为什么不仅仅是:
o.GetType().GetProperty(propertyName).SetValue(o,newValue,null)?谢谢,但它似乎不起作用。“o.GetType()可以工作并向我显示“o”对象的类的名称和全名,但调用“o.GetType().GetProperty(“strCancer”)”返回null。然后我无法针对该空值调用SetValue()。(“strCancer”是我试图存储与两个复选框对应的“yes”或“no”的变量的名称。)这些对我来说是新方法,所以我将从这里开始挖掘。很抱歉,你抢先了我一步。我在键入评论时按[Enter]。不能在这里的评论框中这样做;它以为我打字完了!我需要访问实际的对象“o”点,我想不是它的类型。是,propertyName确实指示我要更新的字符串数据成员的名称。是!我目前正在传递一个对“o”的引用,但是如果这样做有效的话,我可以传递实际对象本身。