Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将类对象传递到string.format_C#_.net_C# 4.0 - Fatal编程技术网

C# 如何将类对象传递到string.format

C# 如何将类对象传递到string.format,c#,.net,c#-4.0,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 param

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

如何实现这一点?

尝试以下方法:

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

你想达到的目标是不可能的。我打赌您希望获得行为,这样对象的
{0}
{1}
将被
param1
param2
替换。首先,如果这是可能的,编译器如何知道您想要传递哪些属性?其次,如果您传递了带有
3
占位符的
2
对象,该怎么办

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);

为什么不直接给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);

您得到的错误是因为您想要显示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); 
    }
}
void Main()
{
var test=newtestprimaryobject(){param1=“param1”,param2=“param2”,param3=“param3”,param4=“param4”};
控制台写入线(测试);
test.Formatter=新参数3和4();
控制台写入线(测试);
test.Formatter=新参数1和2();
控制台写入线(测试);
}
公共类TestPrimaryObject
{
公共TestPrimaryObject(){
Formatter=new Param1And2();//在此处设置默认值
}
公共字符串param1{get;set;}
公共字符串param2{get;set;}
公共字符串param3{get;set;}
公共字符串param4{get;set;}
公共IStringOverride格式化程序{get;set;}
公共重写字符串ToString(){
返回格式化程序.Format(此);
}
}
公共接口IStringOverride{
字符串格式(T arg);
}
公共类param1和2:IStringOverride{
公共字符串格式(TestPrimaryObject arg){
返回字符串。格式(“http://example.com?var1={0}&var2={1},arg.param1,arg.param2);
}
}
公共类param3和4:IStringOverride{
公共字符串格式(TestPrimaryObject arg){
返回字符串。格式(“http://example.com?var1={0}&var2={1},arg.param3,arg.param4);
}
}

只需调用
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

您试图传递的
type1
是什么?您在格式化字符串中定义了两个参数,但只传递了一个。我不知道您最终要实现的是什么。type1将是任何类objectparameter列表都可以根据输入url而变化。如果我删除take(2),那么它也可以工作。非常感谢。在我的例子中,我想比较url参数名和对象参数名,如果匹配,然后分配值。我不会传递两个对象,它将始终是一个对象,但参数名应与变量名字符串FormattedString=string.Format匹配(“{0}¶m2={1}”,type1);否,因为每次对象和URL都会更改。所以string.Format语句将在方法中,该方法将输入对象和url。所以将对象传递给函数/方法