在c#中使用泛型参数调用委托

时间:2009-11-05 23:03:17

标签: c# generics delegates

我有一个班级:

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喜欢查看哪个委托参数匹配,然后运行它们

这可能吗?我有什么选择来创建这样的代表?

由于

3 个答案:

答案 0 :(得分:4)

编辑:在进一步考虑之后,我不相信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>

答案 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);

}

}

我希望有人觉得这很有帮助。我相信有人会对此有所说明,但它对我有用。