创建参数为reft的方法
本文关键字:方法 reft 参数 创建 | 更新日期: 2023-09-27 18:13:22
这是我在一个项目中得到的,包括相当复杂的反射情况:
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
)。所以现在,我为每个类型调用一次方法,做不必要的多个枚举。
SOLVED:我不需要ref
来调用参数类(SetValue
, GetValue
, InvokeMember
等)的反射方法,这意味着我可以完全跳过ref
。真的,我应该试试的。
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# -有趣的"参数引用"特性,有什么解决办法吗?-栈溢出