创建参数为reft的方法

本文关键字:方法 reft 参数 创建 | 更新日期: 2023-09-27 18:13:22

这是我在一个项目中得到的,包括相当复杂的反射情况:

static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }
// Example call:
PopulateValues(propertyNames, ref list1);

我真的想添加paramsparams ref T[] lists来允许使用:

PopulateValues(propertyNames, ref list1, ref list2, ...);
然而,这给了我以下错误:

参数不能同时有'params'和'ref'修饰符。

我最初的想法是让list成为object[],但用法会很难看(铸造object)。所以现在,我为每个类型调用一次方法,做不必要的多个枚举。

SOLVED:我不需要ref来调用参数类(SetValue, GetValue, InvokeMember等)的反射方法,这意味着我可以完全跳过ref。真的,我应该试试的。

创建参数为reft的方法

On ref + params:

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

我唯一能想到的就是手动创建一些重载。


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

params实际上是一个数组;因此,只需将其作为数组参数(T[],而不是ref),并在返回之前简单地更改值。这是两种情况下最接近的情况。例子:

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

这在c#的语法中是不可能的。此外,我无法想象这是怎么回事。你得到了你的数组,但在其中设置一个项会设置参考值吗?

下面是一些有趣的解决方案:

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# -有趣的"参数引用"特性,有什么解决办法吗?-栈溢出