gpt4 book ai didi

c# - 有没有比使用字典作为参数更有效的方法

转载 作者:行者123 更新时间:2023-11-30 19:53:37 33 4
gpt4 key购买 nike

有没有更有效的方法。

函数:

public void someFunction(Dictionary<string, object> args){
foreach (var item in args){
Console.WriteLine("key: " + item.Key + " value: " + item.Value);
}
}

调用看起来不太好的函数:<-- 这就是问题所在

someFunction(new Dictionary<string, object>
{
{ "number", 3 },
{ "text", "Some Text" }
}));

输出:

key: number value: 3
key: text value: Some Text

我想实现这样的我可以随时更改传递的变量名称和值

someFunction(["number" => 3, "text" => "Some Text"]);

我想将一个字符串名称和一个对象类型数组传递给该函数,以便我可以遍历它。此代码有效,但我希望它看起来更整洁。

在 PHP 中有 http://php.net/manual/en/function.compact.php

这使得它能够在您的代码中使用数组中的变量名称和值。对于 C#,我必须使用整个字典。

我希望看到一种更有效的方法。

编辑:谢谢你们。不知道我会这么快得到答案 0_0

最佳答案

如果您只是为调用者寻找稀疏语法,您可以使用匿名类型,类似于 jquery 传递 optional 的方式。示例:

public static void someFunction(object input)
{
foreach (var p in input.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
Console.WriteLine("{0}={1}", p.Name, p.GetValue(input));
}

函数本身有点乱,但对于调用者来说,语法非常轻量级:

someFunction( new { Number = 3, Text = "Some text"});

输出:

Number=3
Text=Some text

如果您打算经常这样做,可以使用扩展方法来减轻一些痛苦。我将我的命名为 Extract(),如下所示:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;

public static class ExtensionMethods
{
public static Dictionary<string, object> Extract<T>(this T input) where T : class
{
return input
.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.ToDictionary( p => p.Name, p => p.GetValue(input));
}
}

public class Program
{
public static void someFunction(object input)
{
var parameters = input.Extract(); //Magic

Console.WriteLine("There were {0} parameters, as follows:", parameters.Count);
foreach (var p in parameters)
{
Console.WriteLine("{0}={1}", p.Key, p.Value);
}
}

public static void Main()
{
someFunction(new { number = 3, text = "SomeText" } );
someFunction(new { another = 3.14F, example = new DateTime(2017, 12, 15) } );
}
}

DotNetFiddle 上输出:

There were 2 parameters, as follows:
number=3
text=SomeText
There were 2 parameters, as follows:
another=3.14
example=12/15/2017 12:00:00 AM

这种方法的主要缺点是您不能使用接口(interface)或做任何事情来要求某些键存在。此外,您还必须使用反射,这需要多做一些工作。如果您想避免这些缺点,您可以使用相同的方法但使用非匿名类型,如下所示:

class SomeFunctionParams
{
public int Number { get; set; }
public string Text { get; set; }
}

public static void someFunction(SomeFunctionParams params)
{
Console.WriteLine("Number={0}", params.Number);
Console.WriteLine("Text={0}", params.Text);
}

...但是这样你就会失去匿名类型的动态优势。

另一种选择是将每个可能的键作为可选参数公开,并且只提供您想要的:

void someFunction(int Number = default(int), string Text = default(string), DateTime SomeOtherParam = default(DateTime))
{
if (Number != default(int)) Console.WriteLine("Number={0}", Number);
if (Text != default(string)) Console.WriteLine("Text={0}", Text);
if (SomeOtherParam != default(DateTime)) Console.WriteLine("SomeOtherParam={0}", SomeOtherParam);
}

someFunction(Number : 3, Text : "Some text");

关于c# - 有没有比使用字典作为参数更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47733319/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com