2017-06-23 9 views
1

私はいくつかのプライベートプロパティと2つのパブリックプロパティ(値と型)を持つ単純なクラスを持っています。 obj.valueを呼び出さなくても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と書くだけで、ユーザーがアクセスできるようにします。 Javascriptがバックエンドオブジェクトを呼び戻しているので、C#ではこの動作が必要です(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.value = 45; 

よりもJavaScriptで、より自然である

a = 45; 

のように、独自のスクリプトを記述します: はここに私の実際のコードですC#のSmartNumericオブジェクト。オブジェクトは更新を受け取り、値を更新して追加のプロパティが必要な場合は、データベースに戻る必要があります。

+2

なぜこの動作が必要ですか?あなたが達成する必要があるものに対して間違ったアプローチをしている可能性があります。 –

+0

あなたが求めていることは理にかなっていません。どのような意味があるか考えてみてください。つまり、objを他の変数に代入することは決してできません。例えば'var obj2 = obj;'は 'obj.value'を' obj2'に代入します。実際、 'obj'を参照する式は' obj.value'を参照します。したがって、objを操作することは決してできません。 – RJM

+0

私はそれが理にかなっていないことを理解していますが、私はいくつかのC#ウィザードがアクセサーの魔法のようなものを思い付くかどうか疑問に思っていました。これにアプローチする最も簡単な方法は、単純なオブジェクト(文字列)を作成するが、他の値を関連付ける方法を見つけることです。私はオブジェクトにアクセスするときにこの配列にアクセスすることができないので、これらのプロパティを保持するために別の配列を使うことはできません... – pdube

答えて

0

最終的な答えはできないということです。変数は変数であり、オブジェクトはオブジェクトです。他のプロパティをオブジェクトにすることなく、他のプロパティを変数に関連付ける方法がわかりません。したがって、オブジェクトでなければならず、obj.valueで値にアクセスします。

2

はい、あなたはこれにより

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

は、あなたのクラスに追加のように、あなたがしたいプロパティの値を返すために、MyClassの中ToStringメソッドをオーバーライドすることができ、最後の行は、あなたを印刷し、「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

関連する問題