我正在尝试将对象作为参数传递给String.Format
,但是由于它没有获得要分配的对象属性,因此无法抛出从零开始的索引异常。
如何将类对象传递给String.Format
?
class TestPrimaryObject
{
public string userId { get; set; }
public string param2 { get; set; }
public string param3 { get; set; }
public string param4 { get; set; }
}
我将上述课程的对象传递给String.Format
。以下是对象属性的值:
TestPrimaryObject objTest = new TestPrimaryObject();
objTest.userId = "test1";
objTest.param2 = "test2";
objTest.param3 = "test3";
objTest.param4 = "test4";
string formatedString = string.Format("http://example.com?param3={0}&userId={1}", objTest);
参数可能因URL
而异我如何实现这一目标?
答案 0 :(得分:1)
试试这个:
var objTest = new TestPrimaryObject {
param1 = "test1",
param2 = "test2",
param3 = "test3",
param4 = "test4"
};
var path = "http://example.com?param2={0}¶m4={1}";
//HttpUtility from System.Web;
var keys = HttpUtility.ParseQueryString(new Uri(path).Query).AllKeys
.Select(x => objTest.GetType().GetProperty(x).GetValue(objTest)).ToArray();
var formatedString = string.Format(path, keys);
//output - http://example.com?param2=test2¶m4=test4
答案 1 :(得分:0)
你想要实现的目标是不可能的。我打赌你希望获得这种行为,以便{0}
和{1}
被对象的param1
和param2
取代。首先,如果这是可能的,编译器怎么知道你要传递哪些属性?其次,如果您使用2
占位符传递3
个对象,该怎么办?
class Object1 {
public int Property1 { get; set; }
public int Property2 { get; set; }
}
现在想象一下这样的场景:
string.Format("{0} {1} {2}", new Object1(), new Object1());
编译器是否应该从第二个或另一个方向获取第一个对象的2
属性?
您必须明确传递属性。
string formatedString = string.Format("http://example.com?var1={0}&var2={1}", objTest.param1, objTest.param2);
答案 2 :(得分:0)
为什么不直接将值分配给url
objTest.param1 = "test1";
objTest.param2 = "test2";
objTest.param3 = "test3";
objTest.param4 = "test4";
string sURL = "http://example.com?var1="+objTest.param1+"&var2="+objTest.param2
//string formatedString = string.Format("http://example.com?var1={0}&var2={1}", type1);
答案 3 :(得分:0)
您获得的错误是因为您想要显示2个参数{0} {1}并且您只提供1个参数。
如果希望输出显示属性:我建议覆盖类的ToString()函数。并使用策略模式来相应地改变行为。
请注意,这不是一个优雅的解决方案。
void Main()
{
var test= new TestPrimaryObject(){ param1="param1", param2="param2", param3="Param3", param4="param4"};
Console.WriteLine(test);
test.Formatter = new Param3And4();
Console.WriteLine(test);
test.Formatter = new Param1And2();
Console.WriteLine(test);
}
public class TestPrimaryObject
{
public TestPrimaryObject(){
Formatter= new Param1And2(); // set default here
}
public string param1 { get; set; }
public string param2 { get; set; }
public string param3 { get; set; }
public string param4 { get; set; }
public IStringOverride<TestPrimaryObject> Formatter {get;set;}
public override string ToString(){
return Formatter.Format(this);
}
}
public interface IStringOverride<T>{
string Format(T arg);
}
public class Param1And2 : IStringOverride<TestPrimaryObject>{
public string Format(TestPrimaryObject arg){
return string.Format("http://example.com?var1={0}&var2={1}", arg.param1, arg.param2);
}
}
public class Param3And4 : IStringOverride<TestPrimaryObject>{
public string Format(TestPrimaryObject arg){
return string.Format("http://example.com?var1={0}&var2={1}", arg.param3, arg.param4);
}
}
答案 4 :(得分:0)
只需拨打一次String.Format
,就无法实现您的目标。由于参数的数量会有所不同,因此您需要有条件地生成具有任意数量参数的URL。您可以创建一个方法来执行此操作:
publc string FormatUrl(string url, TestPrimaryObject objTest)
{
StringBuilder sb = new StringBuilder();
if (!String.IsNullOrEmpty(objTest.userId))
{
sb.Append($"userId={objTest.userId}");
}
if (!String.IsNullOrEmpty(objTest.param2))
{
if (sb.Length > 0)
sb.Append("&");
sb.Append($"param2={objTest.param2}");
}
if (!String.IsNullOrEmpty(objTest.param3))
{
if (sb.Length > 0)
sb.Append("&");
sb.Append($"param3={objTest.param3}");
}
if (!String.IsNullOrEmpty(objTest.param4))
{
if (sb.Length > 0)
sb.Append("&");
sb.Append($"param4={objTest.param4}");
}
return $"{url}?{sb.ToString()}";
}
并称之为:
TestPrimaryObject objTest = new TestPrimaryObject();
objTest.userId = "test1";
objTest.param2 = "test2";
objTest.param3 = "test3";
objTest.param4 = "test4";
string url = FormatUrl("http://www.example.com/", objTest);
它将返回:
http://www.example.com/?userId=test1¶m2=test2¶m3=test3¶m4=test4