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