在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; } 
} 
+0

感谢您的帮助,请参阅我的评论@Tony和更新后的问题 – 2009-11-05 23:26:07

+0

接口是答案,只是需要停止愚蠢! – 2009-11-06 11:04:58

编辑:思考它远一点,我不相信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>

+0

嗯感谢您的信息,看起来像即将走出运气。 ive用更多的信息更新了这个问题,认为我可能会通过简化问题略微误导你:( – 2009-11-05 23:25:36

+0

我可以不使用表达式>代替,然后修改表达式到正确的T当应用它? – 2009-11-06 09:15:48

+0

@Andrew:嗯......可能......不确定,我会尽力记得在稍后再看看这个 – 2009-11-06 09:43:10

我知道这是一个旧帖子,但我想它会帮助下一个可能想要这样做的人。我对这个想法进行了修改,因为我觉得它是一个非常理想的功能。我得到了有一个通用的参数委托做的工作如下:

公众委托无效AppSettingsHandlerMethodSetKeyValue(字符串键,T值);

公共类AppSettingsHandler

{

公共CacheHandler(AppSettingsHandlerMethodSetKeyValue setAppSettingsVariable)

{

SetApplicationSettingsVariable =(AppSettingsHandlerMethodSetKeyValue)setAppSettingsVariable;

}

内部AppSettingsHandlerMethodSetKeyValue SetApplicationSettingsVariable {得到;组; }

内部空隙SetApplicationSetting(字符串键,T值)

{

SetApplicationSettingsVariable(键,值);

}

}

我希望有人认为这很有帮助。我确定有人会对此有所评论,但它适用于我。