簡體   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