[英]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.