创建带有 ref T 参数的方法。

3

以下是我在一个包含相当复杂的反射案例中得到的内容:

static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }

// Example call:
PopulateValues(propertyNames, ref list1);

我真的很想添加参数并进行参数 ref T[] 列表以允许使用:

PopulateValues(propertyNames, ref list1, ref list2, ...);

然而,这给了我以下错误:
参数不能同时具有“params”和“ref”修饰符。
我最初的想法是让list成为一个object[],但使用起来会很丑陋(强制转换object)。因此,目前我对每种类型调用方法一次,进行不必要的多次枚举。
已解决:在参数类上调用反射方法(SetValueGetValueInvokeMember等)时,我不需要ref,这意味着我可以完全跳过ref。实际上,我应该尝试一下这个方法。

list1和list2中包含了什么? - thumbmunkeys
2
你真的确定需要使用“ref”关键字吗?如果是类,那么您可以修改该对象的属性而不更改对该对象的引用。 - Hans Kesting
你能更详细地描述一下你的实际问题吗?你在使用那些列表参数做什么?你传递的是什么?字段还是局部变量? - CodesInChaos
4个回答

2

关于 ref + params

成员不能是引用。由于params将每个参数转换为数组成员,因此这是不可能的。

我能想到的唯一办法就是手动创建多个重载。


但在您的情况下,我不明白为什么需要首先使用ref。要向列表中添加成员,您不需要更改引用本身,因此首先不需要通过ref传递它。


这是正确的,我不需要 ref 来对参数进行修改的反射。 - Simeon

1

params 实际上是一个数组;因此,只需将其作为数组参数 (T[],不需要 ref) 并在返回之前简单地更改值。这是您在一般情况下能够实现的最接近的方法。例如:

Foo[] values =....
SomeMethod(values);
// now look at values[n] etc

你的例子中Foo类可以替换成方法参数3的Bar类。 - Simeon

0

使用C#的语法是不可能实现的。此外,我无法想象那将如何工作。你可以获得数组,但设置其中一个项目会设置引用值吗?


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# - 有趣的“ref参数”功能,有什么解决方法吗?- Stack Overflow


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接