我可以使用C#中的对象名称访问对象属性吗?

问题描述:

我有一个私人属性和2个公共属性(值和类型)的简单类。我试图找到一种方法来调用对象,以便它返回它的值属性,而不必调用obj.value。我不认为这是可能的。我可以使用C#中的对象名称访问对象属性吗?

这里是我的想法:

public class myclass { 
    private int property1; 
    private int property2; 
    public string value; 
    public string type; 

    public myclass(int property1, int property2, string value, string type) 
    { 
     this.property1 = property1; 
     this.property2 = property2; 
     this.value = value; 
     this.type = type; 
    } 
} 

var obj = new myclass(1, 2, "abc", "string"); 
console.write(obj.value); // returns abc 
console.write(obj.type); // returns string 
console.write(obj); // expecting abc 

是否有办法在最后一行返回ABC这个语法?

你在问我为什么要实现这样的目标?我正在使用Javascript编程模块构建服务。这些对象是变量,我希望用户只需通过编写obj而不是obj.value来访问它们。我需要C#(而不是Javascript)的这种行为,因为Javascript正在回调后端对象。如果我不必保留那些容易的私人物业,但我需要拥有它们。

UPDATE: 为了更清楚:这个类是由JavaScript解释(Jint在这种情况下)被调用,而类有,如果它的价值被更新来更新数据库,所以需要私人财产。 这里是我的实际代码:

public class SmartNumeric : ISmartVariable 
{ 
    private Boolean _simulation; 
    private Guid UserId; 
    private long userKeyId; 
    private long variableKeyId; 
    private string Name; 
    public string type 
    { 
     get { 
      return "numeric"; 
     } 
    } 
    private float _value; 
    public float value 
    { 
     get { 
      return _value; 
     } 

     set { 
      _value = value; 

      if (!_simulation) 
       new SmartCommon().SetValue(userKeyId, variableKeyId, value.ToString()); 
     } 
    } 

    public SmartNumeric(Guid UserId, long userKeyId, long variableKeyId, string Name, float value, Boolean simulation) 
    { 
     this.Name = Name; 
     this._value = value; 
     this.UserId = UserId; 
     this.userKeyId = userKeyId; 
     this.variableKeyId = variableKeyId; 
     this._simulation = simulation; 
    } 
} 

因此,例如,用户会写自己的剧本就像

a = 45; 

是在Javascript比

a.value = 45; 

,其中一个是指更自然C#中的一个SmartNumeric对象。该对象接收更新,并且这是我需要返回到数据库以更新值并需要其他属性的位置。

+2

为什么你需要这种行为?你很可能会采取错误的做法来达到你需要达到的目标。 –

+0

您要求的内容没有意义。想想会有什么影响。这意味着你永远无法将'obj'赋值给另一个变量。例如'var obj2 = obj;'实际上将'obj.value'赋值给'obj2'。实际上,任何引用'obj'的表达式都会引用'obj.value'。所以你永远无法操纵'obj'。 – RJM

+0

我明白它没有意义,但我想知道如果一些C#向导可以拿出一个访问器魔术或什么的。解决这个问题的最简单的方法是创建一个简单的对象(一个字符串),但找到一种将其他值关联的方法。我不能只使用单独的数组来保留这些属性,因为当我访问该对象时,我无法访问此数组...... – pdube

最终答案是它不能完成。一个变量是一个变量,一个对象是一个对象。试图摆脱这一点,作弊只会带来其他问题,我看不出如何将其他属性关联到变量而不将其作为对象。所以它必须是一个对象,值将通过obj.value访问。

是的,您可以覆盖在MyClass的ToString方法来返回你想要的属性的值,如

public override string ToString() 
{ 
    return this.value; 
} 

有了这个添加到您的类,最后一行将打印你“ABC”

注意:这里发生的是,基本上当您调用Console.WriteLine(<Something>)时,它会尝试调用类Object中存在的ToString()方法。现在我们知道Object类是我们拥有的任何类的超类。因此,我们重写ToString()方法,并返回我们想要从我们的类中返回的任何字符串。

您的最后一行必须是Console.WriteLine(obj.ToString())之类的内容。

希望这有助于!

+0

这将在OP给出的具体示例中起作用,但仅仅是因为'console.write'当它的参数是一个对象时调用ToString()。在任意表达式中使用'obj'的一般情况下,这不起作用。由于OP要求“找到一种方法来调用该对象,以便它返回它的值属性而不必调用obj.value”,在我看来,一般情况下是要求的。这个答案并没有真正回答这个问题。 – RJM

+0

我还需要能够做obj1 = obj2并设置值。所以我对此采取了错误的做法。我需要保持没有类的关联属性...哎哟...我想我必须回落obj1.value = obj2.value – pdube