时间:2011-11-02 15:41:42

标签: c# c#-4.0

这是我在项目中得到的,包括相当复杂的反思案例:

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来调用参数类(SetValueGetValueInvokeMember等)的反射方法,这意味着我可以完全跳过ref。真的,我应该尝试过。

4 个答案:

答案 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