我有一个班级:
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; }
}
理想情况下,我喜欢使用以下语法来定义一些委托:
CreateDelegate<MyClass<object>>(mc => mc.TestProperty = "hello");
CreateDelegate<MyDerivedClass<object, object>>(mc => mc.OtherProp = 4);
然后给出一个对象,id喜欢查看哪个委托参数匹配,然后运行它们
这可能吗?我有什么选择来创建这样的代表?
由于
答案 0 :(得分: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>
。
答案 1 :(得分:3)
您可以创建一个界面来封装您需要的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; }
}
答案 2 :(得分:0)
我知道这是一个老帖子,但我认为它会帮助下一个可能想要这样做的人。我稍微修改了这个想法,因为我发现它是一个非常理想的功能。我通过执行以下操作获得了具有通用参数的代理:
public delegate void AppSettingsHandlerMethodSetKeyValue(string key,T value);
public class AppSettingsHandler
{
public CacheHandler(AppSettingsHandlerMethodSetKeyValue setAppSettingsVariable)
{
SetApplicationSettingsVariable =(AppSettingsHandlerMethodSetKeyValue)setAppSettingsVariable;
}
internal AppSettingsHandlerMethodSetKeyValue SetApplicationSettingsVariable {get;组; }
internal void SetApplicationSetting(字符串键,T值)
{
SetApplicationSettingsVariable(key,value);
}
}
我希望有人觉得这很有帮助。我相信有人会对此有所说明,但它对我有用。