【问题标题】:How to call a Dictionary Object with Func as parameter?如何以 Func 为参数调用字典对象?
【发布时间】:2013-08-08 15:05:35
【问题描述】:

我正在获取这个库,它由以前的开发人员在内部开发,如下所示

public MyClass<T>
{
    public Dictionary<String, Func<T,String>> AttributesUsing{ get; set;}
    public void  setAttributesUsing(Action<Dictionary<String, Func<T, String>>> t)
    {
                AttributesUsing = new Dictionary<String, Func<T, String>>();
                t(AttributesUsing);

    }

}

在razor视图中,我们可以这样调用组件

....
....

.setAttributesUsing(attr =>
{
    attr.Add("width", item => (item.ActualDays * 19).ToString());
});

....

问题在他还没写完的后端代码中,我们怎么调用呢?

这是以下相关的部分

foreach(T item in DataSource)
{
      MyClass<T> m = new MyClass<T>()
      m.AttributesUsing(???????)  <---- what do i pass in here?
}

我试着像这样传入 T 对象

m.AttributesUsing(item) 

但显然这是不行的。获取“不能像方法一样使用”,因为它是一个 Dictionary 对象。有点困惑。

谢谢

【问题讨论】:

  • 您提供了一个Action&lt;T&gt;,它提供了一个Dictionary&lt;String, Func&lt;T, String&gt;&gt;,其中T 是为类的初始化提供的任何内容:MyClass m = new MyClass(),我确定它不会像您一样编译在这种情况下没有指定T
  • 不幸的是,我不熟悉“剃刀视图”这个词。但是那部分显示的语法在我看来就像一个普通的 C# lambda 函数。你不能把同样的代码粘贴到你的“??????”中
  • @Liming 如果您的foreach 中的T 是我上面提到的类型的字典,那么您不能单独将它作为参数传递,该方法需要一个委托。试试 lambda:m.AttributesUsing(item =&gt; item.Clear());
  • 亚当,你是对的。抱歉,我在这里发布简化版本时错过了部分。修改了原代码。
  • 类似m.setAttributesUsing(new Action&lt;Dictionary&lt;string, Func&lt;int, string&gt;&gt;&gt;(func =&gt; { /* Do something here */ })); ?

标签: c# generics dictionary


【解决方案1】:

你可以使用委托函数吗?

如果我得到你想要/需要的东西,我想这样的事情。

public delegate string readDictionary(T obj)
{
    //do some stuff, read attributes
    //return object attributes
}

这样你就不会传递一个对象(有点)并为 attributesUsing() 获取来自它的返回属性

【讨论】:

    【解决方案2】:

    没关系。想通了。由于 Func 返回一个字符串,所以在“MyClass”中,我只是声明了另一个属性来“保存”最终值

    public Dictionary<String, String> Attributes;
    

    在调用代码中循环遍历它并像这样调用

    foreach(T item in DataSource)
    {
          MyClass<T> m = new MyClass<T>()
          foreach (KeyValuePair<String, Func<T, String>> pair in m.AttributesUsing)
          { 
                m.Attributes = new Dictionary<String, String>();
                m.Attributes.Add(pair.Key, pair.Value(item));
          }
    }
    

    我认为有一种更简单的方法可以在调用时传入“T”,但看起来没有。

    非常感谢大家

    【讨论】:

    • Servy,我的意思是,我认为有一种方法可以做到这一点,而无需实际循环遍历 Dictionary 对象,然后在该对的 .Value 上调用 func 调用。
    • 如果您只想要其中一个值,您可以只调用那个值。如果你想对所有的值做一些事情,你需要遍历所有的值。从概念上讲,避免它是不可能的。您可以通过调用可以为您执行此操作的函数(即使用 LINQ)来隐藏它,但这并不意味着迭代不会在幕后进行。
    • 服务。是的,绝对同意!不过,如果您知道我为 m.AttributesUsing 使用的循环是什么 LINQ 方法,请告诉我。现在,这只是关于好奇心。谢谢
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2023-03-14
    • 2021-08-11
    相关资源
    最近更新 更多