繁体   English   中英

转换功能 <T, object> 到功能 <FrameworkElement, object>

[英]Convert Func<T, object> to Func<FrameworkElement, object>

我有2节课:

class Model
{
    //...
    public Func<FrameworkElement , object> Property { get; set; }
    //...
}

class Other
{
    public void MyMethod<T>(Type type, Func<T, object> selector) where T : FrameworkElement
    {
        this.MyList.Add(new Model() { Property = selector  });
    }    
}

我有一个错误: Impossible to convert Func<T,object> to Func<FrameworkElement,object>

当我尝试:

var tmp = selector as Func<FrameworkElement, object>

tmp的值为null

为什么我使用这样的方法签名? 因为该方法将被调用,并且我无法预测框架元素是什么,例如:

myVar.MyMethod<TextBox>(t=>t.Text) ; 

要么

myVar.MyMethod<Label>(t=>t.Content) ;

如前所述这里

Func <T,TResult>具有协变量返回类型和变量参数类型。

这意味着T参数可以是“较少派生类”。

因此,如果您执行以下操作,它将起作用:

public class MyFrameworkElement { }
public class MyTextBox : MyFrameworkElement { }

class Program 
{    
        public static Object MyMethod(MyFrameworkElement b) 
        {
            return new Object();
        }

        static void Main(string[] args) 
        {

            Func<MyFrameworkElement, Object> f1 = MyMethod;
            Func<MyTextBox, Object> f2 = f1;
       }
}

如您所见,可以将Func <MyFrameworkElement,Object>分配给Func <MyTextBox,Object>,因为第一个参数是可变的(在这种情况下,您可以为MyTextBox分配“较少派生类型” MyFrameworkElement)。

就像我说的,类型参数是协变的,而不是协变的,因此它反之亦然!

像这样:

class Program 
{    
    public static Object MyMethod2(MyTextBox b) 
    {
            return new Object();
    }

    static void Main(string[] args) 
    { 
        Func<MyTextBox, Object> f3 = MyMethod2;

        //This does not compile, and with cast you cannot make this work either.
        Func<MyFrameworkElement, Object> f4 = f3;  // as Func<MyFrameworkElement, Object>; <- does not help
    }
}

这是有道理的,因为MyMethod2具有MyTextBox参数,而f4将指向MyFrameworkElement。 MyTextBox可以具有您可以在MyMethod2中访问的Text属性,但是使用f4时,您将传递一个MyFrameworkElement,该属性不具有该属性。

不幸的是,您想做的是第二种情况。

铸造功能<t>功能<object><div id="text_translate"><p>我试图弄清楚如何将Func&lt;T&gt;传递给Func&lt;object&gt;方法参数:</p><pre> public void Foo&lt;T&gt;(Func&lt;T&gt; p) where T: class { Foo(p); } public void Foo(Func&lt;object&gt; p) { }</pre><p> <strong>奇怪的是,它适用于 NET 4.0 Class 库,但不适用于 Silverlight 4 Class 库。</strong> 实际上我希望它在 Silverlight 中工作,并且我输入了诸如Func&lt;T, bool&gt;之类的参数</p></div></object></t>

[英]Casting Func<T> to Func<object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM