【问题标题】:Can I access an object property just with the object name in C#?我可以仅使用 C# 中的对象名称访问对象属性吗?
【发布时间】:2017-06-23 02:48:20
【问题描述】:

我有一个带有一些私有属性和 2 个公共属性(值和类型)的简单类。我试图找到一种调用对象的方法,以便它返回其值属性而不必调用 obj.value。我觉得不可能。

这是我的想法:

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 正在回调后端对象。如果我不必保留私有财产,这很容易,但我需要拥有它们。

更新: 为了更清楚:这个类将由 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 中比在 Javascript 中更自然

a.value = 45;

其中 a 指的是 C# 中的 SmartNumeric 对象。该对象收到更新,这是我需要返回数据库以更新值并需要其他属性的地方。

【问题讨论】:

  • 为什么需要有这种行为?您很有可能采取了错误的方法来实现您需要实现的目标。
  • 你所要求的没有意义。想想会有什么影响。这意味着您永远无法将obj 分配给另一个变量。例如var obj2 = obj; 实际上会将obj.value 分配给obj2。事实上,任何引用obj 的表达式都会引用obj.value。所以你永远无法操纵obj
  • 我知道这没有意义,但我想知道是否某些 C# 向导可以想出访问器魔术之类的东西。解决此问题的最简单方法是创建一个简单对象(字符串),但要找到一种将其他值与其关联的方法。我不能只使用单独的数组来保留这些属性,因为当我访问对象时,我无权访问该数组...

标签: c# class accessor


【解决方案1】:

是的,你可以重写MyClass中的ToString方法,返回你想要的属性值,比如

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

将此添加到您的班级后,最后一行将打印您“abc”

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

你的最后一行必须是Console.WriteLine(obj.ToString())

希望这会有所帮助!

【讨论】:

  • 这将在 OP 给出的特定示例中起作用,但这只是因为 console.write 在其参数是对象时调用 ToString() 。这在obj 用于任意表达式的一般情况下不起作用。由于 OP 要求“找到一种方法来调用对象,以便它返回其值属性而不必调用 obj.value”,在我看来,一般情况就是所要求的。这个答案并没有真正回答问题。
  • 我还需要能够执行 obj1=obj2 并设置值。所以我对此采取了错误的方法。我需要在没有类的情况下保持关联的属性...哎呀...我想我将不得不依靠 obj1.value=obj2.value
【解决方案2】:

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

【讨论】:

    最近更新 更多