2017-06-23 134 views
1

我有一個私人屬性和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

回答

0

最終答案是它不能完成。一個變量是一個變量,一個對象是一個對象。試圖擺脫這一點,作弊只會帶來其他問題,我看不出如何將其他屬性關聯到變量而不將其作爲對象。所以它必須是一個對象,值將通過obj.value訪問。

2

是的,您可以覆蓋在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