2015-06-20 58 views
1

我有一個名爲Person回默認的toString()的類實例C#

public class Person 
    { 
     string name; 
     int age; 
     SampleObject(string name, int age) 
     { 
     this.name = name; 
     this.age = age; 
     } 
     public override string ToString() 
     { 
     string s = age.ToString(); 
     return "Person: " + name + " " + s; 
     } 
    } 

我已經覆蓋了toString()方法返回的人的類名。

我使用的是類另一個類:

public class MyClass 
{ 

public int Id {get;set;} 

public Person person {get;set;} 

} 

現在,我要訪問的類作爲

MyClass my = new MyClass(); 

我想,當我執行my.person,它應該返回的ToString( )沒有明確地致電my.person.ToString()

是否有可能,如果可能,我該如何做到這一點。

感謝

+2

如何訪問my.person的Person表示呢?如果這不應該發生,也許person實例應該是一個私人字段,而person屬性應該是一個返回字段的ToString()或其他字符的字符串。 – BoltClock

+1

你爲什麼需要這個? –

+0

@faridbekran我只是想給出一個默認的返回類型,以方便開發類庫的使用者進行開發。少數情況下有用。 – Satyajit

回答

2

我不明白你的問題。但您的問題的解決方案之一是使用implicit cast

public class Person 
    { 
     string name; 
     int age; 
     public Person(string name, int age) 
     { 
      this.name = name; 
      this.age = age; 
     } 
     public override string ToString() 
     { 
      string s = age.ToString(); 
      return "Person: " + name + " " + s; 
     } 
     // here 
     public static implicit operator string(Person d) 
     { 
      return d.ToString(); 
     } 
    } 
    public class MyClass 
    { 

     public int Id { get; set; } 

     public Person Person { get; set; } 

    } 
    static void Main(string[] args) 
    { 
     var myclass = new MyClass(); 
     myclass.Person = new Person("test", 12); 
     // use like this 
     string name = myclass.Person; 
     Console.WriteLine(name); 
     Console.WriteLine("Press any key to continue."); 
     Console.ReadLine(); 
    } 
+1

非常感謝。這是我正在尋找的,它的工作原理。 – Satyajit

+1

@ user1731788請注意,除了你自己或者甚至將來,你可能很難理解爲什麼'Person'返回一個'string'而不是一個實際的人員實例。國際海事組織,沿着這條道路走下去是一個壞主意 –

+0

@YuvalItzchakov:贊同 –

3

您可以創建另一個只讀屬性

public string PersonName { get {return this.person.ToString();} } 

或者增加檢查有可能無效

public string PersonName 
{ 
    get 
    { 
     return (this.person == null) ? String.Empty : this.person.ToString(); 
    } 
} 

根據您有關同一屬性
我設置的人Name評論思維方式與分離/特定財產將更易於維護

public string PersonName 
{ 
    get 
    { 
     return (this.person == null) ? String.Empty : this.person.ToString(); 
    } 
    set 
    { 
     if(this.person == null) 
     { 
      this.person = new Person(value, 0); 
     } 
     else 
     { 
      this.person.Name = value; 
     } 
    } 
} 
+0

VB和C#語法的混搭,也許? ;-) – elgonzo

+3

readonly關鍵字在屬性中是不必要的(事實上是禁止的) - 僅存在getter的事實是將屬性定義爲只讀的。 – BoltClock

+0

謝謝@BoltClock,很高興知道。我有'vb.net'背景:)。也許用'readonly'關鍵字的可讀性可能會好一點。在'vb.net'關鍵字是必需的 – Fabio

1

您可以通過運算符重載實現此目的。

public static implicit operator string(Person p) 
{ 
    return p.ToString(); 
} 

如果您希望可以在MyClass中實現運算符重載,以便它也調用人員。

public static implicit operator string(MyClass my) 
{ 
    return my.person; 
} 

有了這個,你可以這樣做

string personString = my; 
// or my.person if you only implement it for Person 

你也不必對年齡一個字符串變量。 做以下工作將會很好。

return "Person: " + name + " " + age; 

雖然我會建議使用string.Format。

return string.Format("Person: {0} {1}", name, age);