C# 使用params ref T参数创建方法
这是我在一个项目中得到的,包括相当复杂的反射案例:C# 使用params ref T参数创建方法,c#,c#-4.0,C#,C# 4.0,这是我在一个项目中得到的,包括相当复杂的反射案例: static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ } // Example call: PopulateValues(propertyNames, ref list1); 但是,这给了我以下错误: 参数不能同时具有“params”和“ref”修饰符 我最初的想法是让list成为object[],但使用起来很难看
static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }
// Example call:
PopulateValues(propertyNames, ref list1);
但是,这给了我以下错误:
参数不能同时具有“params”和“ref”修饰符
我最初的想法是让list
成为object[]
,但使用起来很难看(铸造object
)。现在,我为每种类型调用一次该方法,执行不必要的多次枚举
已解决:我不需要
ref
来调用参数类上的反射方法(SetValue
,GetValue
,InvokeMember
等),这意味着我可以完全跳过ref
)。真的,我应该试一下。这在C#的语法中是不可能的。此外,我无法想象这将如何工作。你得到了你的数组,但是在其中设置一个项目会设置参考值?params
实际上是一个数组;因此,只需将其设置为数组参数(T[]
,noref
),并在返回之前更改值即可。在tw一般情况下,这是最接近您管理的。例如:
Foo[] values =....
SomeMethod(values);
// now look at values[n] etc
在ref
+params
上:
成员不能是引用。由于params
将每个参数转换为数组成员,因此这是不可能的
我唯一能想到的就是手动创建一些重载
但是在你的情况下,我不明白你为什么首先需要
ref
。要将成员添加到列表中,您无需更改引用本身,因此无需首先将其传递给my ref。以下是一些有趣的解决方案:
public delegate RecursionRefFunc<T> RecursionRefFunc<T>(ref T arg);
public static RecursionRefFunc<T> Boo<T>(ref T input)
{
Console.WriteLine(input); // Work in here
return Boo;
}
public static void Main(string[] args)
{
int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5;
Boo(ref x1)(ref x2)(ref x3)(ref x4)(ref x5);
}
// Output: //
// 1
// 2
// 3
// 4
// 5
public委托RecursionRefFunc RecursionRefFunc(ref T arg);
公共静态递归reffunc Boo(ref T输入)
{
Console.WriteLine(输入);//在这里工作
返回Boo;
}
公共静态void Main(字符串[]args)
{
int x1=1,x2=2,x3=3,x4=4,x5=5;
Boo(参考x1)(参考x2)(参考x3)(参考x4)(参考x5);
}
//输出://
// 1
// 2
// 3
// 4
// 5
委托可以在递归中声明
在外部返回一个函数并再次调用
你会被代码审查员杀死
列表1和列表2中包含什么?您真的确定需要“ref”关键字吗?如果它是一个类,那么您可以修改该对象的属性,而无需更改对该对象的引用。您能更详细地描述一下您的实际问题吗?你在用那些列表参数做什么?你在传递什么?字段或局部变量?您示例中的
Foo
类对于方法参数3可能是Bar
。这是正确的,我不需要ref
来对参数进行更改反射
public delegate RecursionRefFunc<T> RecursionRefFunc<T>(ref T arg);
public static RecursionRefFunc<T> Boo<T>(ref T input)
{
Console.WriteLine(input); // Work in here
return Boo;
}
public static void Main(string[] args)
{
int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5;
Boo(ref x1)(ref x2)(ref x3)(ref x4)(ref x5);
}
// Output: //
// 1
// 2
// 3
// 4
// 5