寻找一种方法来通过一个关联数组的方法。我期待改写在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中使用的机制。这不是原来的我。


我青睐,其具有两个不同的签名的混合方法。注:我没有尝试这样做,可能有两个签名之间的冲突,所以你可得给第二种方法稍有不同的名称,使编译器将它们之间的选择,但我不这么认为

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) { ... }

的想法是,可以采用可变数目的“其返回对象函数”。然后,解析参数的名称出的每个表达 ,并调用每一个以获得其值。

我不认为这是任何不是反映了一个匿名类型更好,但它是另一个需要考虑的方法。

<强>更新

其实我已经写了传递关联数组作为字典在我的博客的想法,的这里这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top