gpt4 book ai didi

c# - 通用委托(delegate)实例

转载 作者:行者123 更新时间:2023-12-05 00:07:03 24 4
gpt4 key购买 nike

我想知道 C#(或底层 .NET 框架)是否支持某种“通用委托(delegate)实例”:这是一个仍然具有未解析类型参数的委托(delegate)实例,在调用委托(delegate)时解决(不是当时委托(delegate)已创建)。我怀疑这是不可能的,但我还是要问...

这是我想做的一个例子,带有一些“???”插入到我想要的 C# 语法似乎不可用的地方。 (显然这段代码无法编译)

class Foo {
public T Factory<T>(string name) {
// implementation omitted
}
}

class Test {
public void TestMethod()
{
Foo foo = new Foo();
??? magic = foo.Factory; // No type argument given here yet to Factory!
// What would the '???' be here (other than 'var' :) )?
string aString = magic<string>("name 1"); // type provided on call
int anInt = magic<int>("name 2"); // another type provided on another call

// Note the underlying calls work perfectly fine, these work, but i'd like to expose
// the generic method as a delegate.
string aString2 = foo.Factory<string>("name 1");
int anInt2 = foo.Factory<int>("name 2");
}
}

有没有办法在 C# 中实际做这样的事情?如果不是,这是语言的限制,还是 .NET 框架中的限制?

编辑:
我问的原因是因为我想将委托(delegate)传递给另一个程序集中的函数,并且不想要求其他程序集必须引用任何特定类型(我的示例中的“Foo”类)。我希望以某种方式弯曲标准 Func<> 委托(delegate),使其适合“???”部分。

最佳答案

这是无法做到的,因为您要声明的是未封闭的泛型类型的变量( magic )。

可以使用未封闭的泛型,但只能在类型级别使用,例如:

delegate T FactoryDelegate<T>(string name);

var magicType = typeof (FactoryDelegate<>);

然后稍后“关闭”该类型:
var stringMagic = magicType.MakeGenericType(typeof(string));

更新:也就是说,这里有一个关于如何使用上述技术来处理未封闭方法“类型”的示例。如果我们可以分配未封闭的类型,仍然没有那么优雅..:
    public class UnclosedMethod
{
private readonly MethodInfo _method;

public UnclosedMethod(Type type, string method)
{
_method = type.GetMethod(method);
}

public T Invoke<T>(string name)
{
var fact = _method.MakeGenericMethod(typeof(T));
return (T)fact.Invoke(this, new object[] { name });
}
}

然后在代码中这样做:
var magic = new UnclosedMethod(typeof(Foo), "Factory");
var x = magic.Invoke<string>("bar");

关于c# - 通用委托(delegate)实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2432083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com