传递关联数组的方法简明方法
-
22-08-2019 - |
题
寻找一种方法来通过一个关联数组的方法。我期待改写在C#中一个ActionScript补间包,但运行与“联想”的数组/对象的麻烦。通常,在Actionscript中我可能会做这样的事情:
public function tween(obj:DisplayObject, params:Object = null):void {
if (params.ease != null) {
//do something
}
//...
}
和这可以被称为如下:
tween(this, {ease:'out', duration:15});
我正在寻找一个方式做在C#中的相同。到目前为止,我收集了我的选择是:
a)产生类或结构来定义可能PARAM键和类型和传递
b)中传递的参数为通用类型
tween(frameworkElement, new {ease = 'out', duration = 15});
假设
public static void tween(FrameworkElement target, object parameters);
和想出一些方法来使用,在补间功能(我不知道如何在关键分开=值的给该对象。任何想法?)
c)中创建一个Dictionary<string, object>
的参数传递到吐温功能
任何其他的想法或示例代码?我是新的C#。
修改强>
我花了一整天都想出解决办法:
“匿名类型不能跨越组件边界共享。编译器确保有至多一个匿名类型属性名称/类型对每个组件中的给定的序列。为了通过组件之间的结构则需要适当地定义它们。“
解决方案
修改强>:这基本上是的HtmlHelper扩展在ASP.NET MVC中使用的机制。这不是原来的我。
我青睐,其具有两个不同的签名的混合方法。注:我没有尝试这样做,可能有两个签名之间的冲突,所以你可得给第二种方法稍有不同的名称,使编译器将它们之间的选择,但我不这么认为。 p>
public static void tween( FrameworkElement target, object parameters )
{
return tween( target, new ParameterDictionary( parameters ) );
}
public static void tween( FrameworkElement target,
ParameterDictionary values )
{
if (values.ContainsKey( "ease" ))
{
....
}
}
然后,你有上的匿名类型使用反射并设置一个字典类ParameterDictionary
public class ParameterDictionary : Dictionary<string,object>
{
public ParameterDictionary( object parameters )
{
if (parameters != null)
{
foreach (PropertyInfo info in parameters.GetType()
.GetProperties())
{
object value = info.GetValue(parameters,null);
this.Add(info.Name,value);
}
}
}
}
这让你既易于使用和易于消费的 - “丑陋”反映的东西是在字典中,而不是在你的方法的一个构造函数包裹起来。而且,当然,词典可以反复用于类似的目的仅写入一次的反射代码。
其他提示
在字典是一种合理的方法。它看起来是这样的:
public static void tween(FrameworkElement target, IDictionary<string, object> parameters)
{
if (parameters.ContainsKey("ease")) {
//do something
}
}
记住,当你通过,你可以用缩短集合初始化语法的值,使其更容易,如:
tween(something, new Dictionary<string, object> { { "ease", "out" }, { duration, 15 } });
这将是一个非常快速的方法大致“同样的事情”为ActionScript代码,但它不是真正伟大的C#。 C#的-ish的方式做这将是做一个真正的TweenParameters结构或类与每个可能的参数属性,然后创建一个通到吐温()。这通常被认为是更容易维护,因为所有的“可用”性能是有目共睹的主叫方没有寻找到吐温()的内部结构,因为它捕获在编译时错误,一个字符串比较不会注意到,直到运行时,如打错字 “持续时间”, “duratoin”。
我选项的风扇(b)中自己 - ;在通过匿名类型和使用反射解析出的值
我已经看到了使用lambda表达式他人实现同样的事情。主叫语法是:
tween(frameworkElement, ease => "out", duration => 15);
和声明将是沿着线的东西:
public static void tween(FrameworkElement target, params Expression<Func<object>>[] parameters) { ... }
的想法是,可以采用可变数目的“其返回对象函数”。然后,解析参数的名称出的每个表达
我不认为这是任何不是反映了一个匿名类型更好,但它是另一个需要考虑的方法。
<强>更新强>