Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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#_Class_Accessor - Fatal编程技术网

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

我是否可以仅使用C#中的对象名称访问对象属性?,c#,class,accessor,C#,Class,Accessor,我有一个简单的类,包含一些私有属性和两个公共属性(值和类型)。我试图找到一种调用对象的方法,这样它就可以返回其value属性,而不必调用obj.value。我认为这是不可能的 以下是我的想法: public class myclass { private int property1; private int property2; public string value; public string type; public myclass(int property

我有一个简单的类,包含一些私有属性和两个公共属性(值和类型)。我试图找到一种调用对象的方法,这样它就可以返回其value属性,而不必调用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中,哪一个比

a.value = 45;

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

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

public override string ToString()
{
    return this.value;
}
将此添加到类中后,最后一行将打印“abc”

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

最后一行必须类似于
Console.WriteLine(obj.ToString())


希望这有帮助

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

为什么需要这种行为?你很有可能对你需要实现的目标采取了错误的方法。你所要求的没有意义。想想这意味着什么。这意味着您永远无法将
obj
分配给另一个变量。e、 g.
var obj2=obj实际上会将
obj.value
分配给
obj2
。事实上,任何引用
obj
的表达式都会引用
obj.value
。所以你永远也无法操纵obj了。我明白这是没有意义的,但我想知道是否有一个C#wizard能想出一个访问器魔术之类的东西。实现这一点的最简单方法是创建一个简单对象(字符串),但找到一种将其他值与之关联的方法。我不能只使用单独的数组来保留这些属性,因为当我访问对象时,我没有访问此数组的权限…在OP给出的特定示例中,这将起作用,但这只是因为
console.write
在其参数为对象时调用ToString()。这在任意表达式中使用
obj
的一般情况下不起作用。因为OP要求“找到一种方法来调用对象,这样它就可以返回其value属性,而不必调用obj.value”,所以在我看来,一般情况就是所要求的。这个答案并不能真正回答问题。我还需要能够执行obj1=obj2并设置值。所以我在这个问题上采取了错误的方法。我需要在没有类的情况下保持属性关联。。。哎哟我想我不得不求助于obj1.value=obj2.value