2016-08-27 87 views
2

是否有可能使用結構作爲參數的string.Format這樣的:傳遞結構,以作爲的String.Format ARGS

struct kid 
{ 
    public string name; 
    public int age; 
}; 

kid.name = alice; 
kid.age = 2; 

Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid)); 

,而不是這樣的:

Console.WriteLine(String.Format("Her name is {0} and she's {1} years old", kid.name ,kid.age)); 

編輯:

該字符串將在運行時從配置文件中讀取

+0

號{0}和{1}都是你不能從一個對象「孩子」獲得兩個不同的屬性。 – jdweng

+2

另外,對於Console.WriteLine,您不需要使用string.Format,因爲WriteLine方法執行相同的操作並以相同的方式接受參數。 – mbrdev

+0

理論上,人們可以在結構體和類中創建一個索引器(如果我沒有記錯的話),然後也許它應該等價於一個字符串數組...現在我沒有一個編譯器來驗證這個答案 –

回答

1

仙ce .Format具有String.Format(string format, params object[] args)的簽名,您可以將您的結構轉換爲對象數組。

struct Kid 
{ 
    public string name; 
    public int age; 

    public object[] ToObjectArray() 
    { 
     return new object[] { 
      name, age }; 
    } 
    public static implicit operator object[](Kid kid) 
    { 
     return kid.ToObjectArray(); 
    } 
}; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Kid kid=new Kid() { name="alice", age=2 }; 

     Console.WriteLine("Her name is {0} and she's {1} years old", kid); 
     // Same as 
     // Console.WriteLine(string.Format("Her name is {0} and she's {1} years old", kid)); 
    } 
} 

你也可以利用協方差和隱式轉換string[]object[]

public string[] ToStringArray() 
    { 
     return new string[] { 
      name, age.ToString() }; 
    } 
    public static implicit operator object[](Kid kid) 
    { 
     return kid.ToStringArray(); 
    } 

,而不是ToObjectArray()

+1

大改變工作,我嘗試到達那裏,但它是一個在線編譯器移動太困難了)) –

7

不知道該怎麼知道原型rty放在哪裏?

你可以做的,而不是在這樣的方式下鍵入string.Format什麼是用C#6.0字符串插值並把它寫這樣的:

Console.WriteLine($"Her name is {kid.name} and she's {kid.age} years old"); 

也許覆蓋ToString()返回它:

struct kid 
{ 
    public override string ToString() 
    { 
     return $"Her name is {name} and she's {age} years old"; 
    } 
} 

然後調用Console.WriteLine(kid.ToString());

+1

嘿,去回答Linq的問題。給我留下字符串插值:) – uTeisT

+1

@uteist - 哈哈:)嗯..洗碗,突然看到了這個問題。無法抗拒 –

+0

我的事情代碼清晰,我將這個想法感謝 –

0

什麼是可能的訪問結構作爲一個數組如此:

如果kid是一個struct kidStr,那麼可以將kid [0]和kid [1]定義爲name和age.ToString(),並將其用作WriteLine中的幾個參數...應該有意義你...

public string this[int i] { 
    get { return i == 0 ? name : age. ToString(); } 
} 

或者更簡單地說

public string[] ToArray() { 
    return new string[2]{ name, age.ToString()}; 
} 

具有在結構kidStr上述索引和實例孩子

Console.WriteLine("name is {0}, age is {1}", kid[0], kid[1]); // or kid.ToArray() 
1

你可以通過你的結構實現IFormattable接口,並提供訪問不同的屬性通過格式字符串:

struct kid : IFormattable { 
    public string name; 
    public int age; 
    public override string ToString() => ToString(null, null); 
    public string ToString(string format, IFormatProvider provider) { 
     switch(format) { 
      case null: 
      case "": 
       return string.Format(provider, "({0:name}, {0:age})", this); 
      case "name": 
       return name.ToString(provider); 
      case "age": 
       return age.ToString(provider); 
      default: 
       throw new ArgumentOutOfRangeException(nameof(format)); 
     } 
    } 
} 

然後,你可以把它寫成如下:

Console.WriteLine("Her name is {0:name} and she's {0:age} years old", kid);