簡體   English   中英

在C#中使用泛型參數調用委托

[英]invoking delegate with generics arguments in c#

我有一堂課:

public class MyClass<T>
{
    public string TestProperty { get; set; }
}

並且我想創建一個委托來在此類的實例上運行,例如:

Action<MyClass<object>> myDelegate = myclass => myclass.TestProperty = "hello";

但是,不能使用MyClass<object>之外的任何其他東西(例如MyClass<DateTime>MyClass<string>調用上述委托。

如何定義委托或修改委托,以便可以在MyClass<T>上執行委托,其中T是可擴展object任何東西?

編輯:可以等到C#4,如果那是可能的話(如果可以,請仍然告訴我如何),盡管我希望現在在3.5中繼續使用它。

編輯:我實際上也有第二課:

public class MyDerivedClass<T1, T2> : MyClass<T1>
{
    public int OtherProp { get; set; }
}

理想情況下,id喜歡使用以下語法來定義一些委托:

CreateDelegate<MyClass<object>>(mc => mc.TestProperty = "hello");
CreateDelegate<MyDerivedClass<object, object>>(mc => mc.OtherProp = 4);

然后給一個對象,id就像查看哪個委托參數匹配,然后運行它們

這可能嗎? 創建此類代表我必須有哪些選擇?

謝謝

編輯:在進一步考慮之后,在這種情況下,我認為C#4不會真正為您提供幫助。 您需要將MyClass類型本身作為變量,但這不是必須的,因為它是一個類。 然而...

您可以編寫一個通用方法來返回特定的操作:

public Action<MyClass<T>> NewTestPropertyDelegate<T>()
{
    return myclass => myclass.TestProperty = "hello";
}

編輯:我之前應該提到過安德魯·哈爾(Andrew Hare)的建議-但這是使用基類而不是接口的另一種選擇。

public abstract class MyClass
{
    public string TestProperty { get; set; }
}

public class MyClass<T> : MyClass
{
    ...
}

然后使用Action<MyClass>

您可以創建一個接口來封裝所需的MyClass<T>的成員:

interface IFoo
{
    String TestProperty { get; set; }
}

然后更改您的委托以使用該接口:

Action<IFoo> myDelegate = myclass => myclass.TestProperty = "hello";

編輯:顯然,您也需要這樣做:

public class MyClass<T> : IFoo
{
    public String TestProperty { get; set; }
}

我知道這是一篇過時的文章,但是我認為這將有助於下一個想要這樣做的人。 我稍微修改了一下這個想法,因為我發現它是一個非常理想的功能。 通過執行以下操作,我得到了具有通用參數的代表:

公共委托void AppSettingsHandlerMethodSetKeyValue(字符串鍵,T值);

公共類AppSettingsHandler

{

公共CacheHandler(AppSettingsHandlerMethodSetKeyValue setAppSettingsVariable)

{

SetApplicationSettingsVariable =(AppSettingsHandlerMethodSetKeyValue)setAppSettingsVariable;

}

內部AppSettingsHandlerMethodSetKeyValue SetApplicationSettingsVariable {get; 組; }

內部void SetApplicationSetting(字符串鍵,T值)

{

SetApplicationSettingsVariable(key,value);

}

}

我希望有人覺得這有幫助。 我敢肯定有人會說些什么,但這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM