如何更改C#中任何函数的参数值?

如何更改C#中任何函数的参数值?,c#,C#,我有这个功能 private void fun(String a, String b, String c) { } 我想做这样的事情 private void fun(String a, String b, String c) { clean(a, b, c); // params clean } private void clean(ref params String[] c) { foreach (String t in c) { t =

我有这个功能

private void fun(String a, String b, String c)
{
}
我想做这样的事情

private void fun(String a, String b, String c)
{
    clean(a, b, c);
    // params clean
}

private void clean(ref params String[] c)
{
    foreach (String t in c)
    {
        t = t.replace("'", " ");
    }
}
当然,这不起作用,因为参数不能是ref

有办法做到这一点吗?我将在很多函数中使用它,其中一些函数有10到15个参数


谢谢,

不,你不能这样做。老实说,如果你有一个有10-15个参数的方法,听起来你可以从更多的封装开始——在这一点上,这是一个不同的游戏,因为如果你传入一个对可变类实例的引用,你的方法可以更改该实例中的属性

如果您能提供更具体的用例细节,这会有所帮助,那么您可能想在
string
上编写一个扩展方法,只是为了方便:

internal string ReplaceQuotes(this string text)
{
    return text.Replace("'", " ");
}
然后,您可以在需要时引用
foo.ReplaceQuotes()
,它不会更改
foo
的值,但这意味着将返回值传递给的任何内容都将被适当地修剪


请注意,如果您这样做是为了避免SQL注入攻击,那么最好使用参数化SQL。当然,这可能与此无关:)

显然,您需要一个单一的魔法方法来实现这一点,但由于这是不可能的,所以不要低估多个重载的简单(但繁琐)解决方案

public static class Cleaner
{
    public static string Clean(this string s)
    {
        return s.Replace("'", " "); 
    }

    public static void Clean(ref string s1)
    {
        s1 = s1.Clean();
    }

    public static void Clean(ref string s1, ref string s2)
    {
        s1 = s1.Clean();
        s2 = s2.Clean();
    }

    public static void Clean(ref string s1, ref string s2, ref string s3)
    {
        s1 = s1.Clean();
        s2 = s2.Clean();
        s3 = s3.Clean();
    }

    // etc ad nauseum...
}


{
    string a = ...;
    string b = ...;
    string c = ...;

    Cleaner.Clean(ref a, ref b, ref c)
}

它并不漂亮,但如果你真的想拥有这个函数,这就是你可以拥有它的方式。

问题是你可以从参数到数组,但不能从相反的方向。你能做的最好的事情仍然是一些手工作业

static void Main(string[] args)
{
    test("A'1", "B**", "'C'D");
}

static void test(string a, string b, string c)
{
    string[] args = new string[] { a, b, c }; //build array
    args = args.Select((s) => s.Replace("'", " ")).ToArray(); //clean array
    a = args[0]; //assign values from array
    b = args[1];
    c = args[2];
}
我试过:

   public Form1()
    {
        InitializeComponent();

        string[] s = new string[3];
        s[0] = "a";
        s[1] = "a";
        s[2] = "a";

        clean(s);

        for (int i = 0; i < s.Length; i++) label1.Text += s[i];
    }

    void clean(params String[] c)
    {
        for(int i=0;i<c.Length;i++) c[i] = "b";
    }
public Form1()
{
初始化组件();
字符串[]s=新字符串[3];
s[0]=“a”;
s[1]=“a”;
s[2]=“a”;
清洁;;
对于(inti=0;i对于(int i=0;iit听起来有点像可观察集合的工作方式,你用谷歌搜索过吗?可能在VB.NET中使用可选参数来完成。可能C#4也有可选参数(我不确定)因此,创建一个包含15个可选
ref string
参数的方法来清理数据。同意SQL注入的内容,如果您查看EF中的quotename实现,它不像“转义所有引号”那么简单。