在C#泛型参数调用委托
我有一个类:在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);
然后给出一个对象,我还想看看哪个委托参数匹配,然后运行它们
这可能吗?我有什么替代方案来创建这样的代表?
感谢
你可以创建一个接口来封装的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; }
}
编辑:思考它远一点,我不相信C#4实际上将帮助你在这种情况下。你需要MyClass
类型本身是变体,但它不能是因为它是一个类。然而...
你可以写一个通用的方法来回报你一个具体的行动:
public Action<MyClass<T>> NewTestPropertyDelegate<T>()
{
return myclass => myclass.TestProperty = "hello";
}
编辑:我应该提到安德鲁·黑尔的建议之前 - 但这里使用一个基类另一种选择,而不是一个接口。
public abstract class MyClass
{
public string TestProperty { get; set; }
}
public class MyClass<T> : MyClass
{
...
}
然后使用Action<MyClass>
。
嗯感谢您的信息,看起来像即将走出运气。 ive用更多的信息更新了这个问题,认为我可能会通过简化问题略微误导你:( – 2009-11-05 23:25:36
我可以不使用表达式
@Andrew:嗯......可能......不确定,我会尽力记得在稍后再看看这个 – 2009-11-06 09:43:10
我知道这是一个旧帖子,但我想它会帮助下一个可能想要这样做的人。我对这个想法进行了修改,因为我觉得它是一个非常理想的功能。我得到了有一个通用的参数委托做的工作如下:
公众委托无效AppSettingsHandlerMethodSetKeyValue(字符串键,T值);
公共类AppSettingsHandler
{
公共CacheHandler(AppSettingsHandlerMethodSetKeyValue setAppSettingsVariable)
{
SetApplicationSettingsVariable =(AppSettingsHandlerMethodSetKeyValue)setAppSettingsVariable;
}
内部AppSettingsHandlerMethodSetKeyValue SetApplicationSettingsVariable {得到;组; }
内部空隙SetApplicationSetting(字符串键,T值)
{
SetApplicationSettingsVariable(键,值);
}
}
我希望有人认为这很有帮助。我确定有人会对此有所评论,但它适用于我。
感谢您的帮助,请参阅我的评论@Tony和更新后的问题 – 2009-11-05 23:26:07
接口是答案,只是需要停止愚蠢! – 2009-11-06 11:04:58