[英]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,该属性不具有该属性。
不幸的是,您想做的是第二种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.