这是我在项目中得到的,包括相当复杂的反思案例:
static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }
// Example call:
PopulateValues(propertyNames, ref list1);
我真的想添加params
并执行params ref T[] lists
以允许使用:
PopulateValues(propertyNames, ref list1, ref list2, ...);
然而,这给了我以下错误:
参数不能包含'params'和'ref'修饰符。
我最初的想法是让list
成为object[]
,但用法很难看(施放object
)。所以现在,我正在为每种类型调用该方法一次,进行不必要的多次枚举。
已解决:我不需要ref
来调用参数类(SetValue
,GetValue
,InvokeMember
等)的反射方法,这意味着我可以完全跳过ref
。真的,我应该尝试过。
答案 0 :(得分:2)
ref
+ params
:会员不能作为参考。由于params
将每个参数转换为数组成员,因此这是不可能的。
我唯一能想到的是手动创建一些重载。
但在你的情况下,我不明白为什么你首先需要ref
。要将成员添加到列表中,您不需要更改引用本身,因此首先不需要将其传递给我。
答案 1 :(得分:1)
params
实际上是一个数组;所以只需将它设为数组参数(T[]
,否ref
),然后在返回之前更改值。这是你在一般情况下最接近的管理方式。例如:
Foo[] values =....
SomeMethod(values);
// now look at values[n] etc
答案 2 :(得分:0)
使用C#的语法是不可能的。此外,我无法想象这将如何运作。你得到你的数组,但是在其中设置一个项目会设置参考值吗?
答案 3 :(得分:0)
这是一些有趣的解决方案:
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
代理可以递归声明。
在外部返回一个函数,然后再次调用。
您将被代码审查员杀死。
广告OW <:CWKSC/MyLib_Csharp
是另一个问题的副本:
c# - Interesting "params of ref" feature, any workarounds? - Stack Overflow