如何将类对象传递给string.format

时间:2017-02-06 06:45:33

标签: c# .net c#-4.0

我正在尝试将对象作为参数传递给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

而异

我如何实现这一目标?

5 个答案:

答案 0 :(得分:1)

试试这个:

var objTest = new TestPrimaryObject {
    param1 = "test1",
    param2 = "test2",
    param3 = "test3",
    param4 = "test4"
};

var path = "http://example.com?param2={0}&param4={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&param4=test4

答案 1 :(得分:0)

你想要实现的目标是不可能的。我打赌你希望获得这种行为,以便{0}{1}被对象的param1param2取代。首先,如果这是可能的,编译器怎么知道你要传递哪些属性?其次,如果您使用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&param2=test2&param3=test3&param4=test4