gpt4 book ai didi

c# - 在运行时添加通用约束?

转载 作者:可可西里 更新时间:2023-11-01 08:26:57 27 4
gpt4 key购买 nike

我对此很困惑,所以如果有人有任何想法。我有通用方法

public void Foo<TClass>(TClass item) where TClass : class
{ }

我想从另一个泛型方法调用这个方法,但是这个泛型方法没有类型约束“where TClass : class”

public void Bar<T>(T item)
{
this.Foo<T>(item);
}

这行不通,我得到了错误

“类型‘T’必须是引用类型才能将其用作参数‘TClass’”

我明白了。但我的问题是 - 如果它是一个类,我可以用 C# 语法做些什么来“过滤”泛型类型“T”以将其传递给“this.Bar”。像....

public void Bar<T>(T item)
{
if (typeof(T).IsClass)
this.Foo<T **as class**>();
}

我意识到我可以使用反射来调用 Foo,但这看起来像是作弊。我可以用 C# 做些什么来在运行时通过约束传递“T”吗?

此外 - 我无法更改方法“Bar”的约束,因为它来自接口(interface),因此约束必须与接口(interface)上的约束相匹配

最佳答案

调用Foo的唯一方式没有反射,就是投item到其层次结构中的类型/类之一(在适当的 IsClass 检查之后)。

显然,您先验知道其层次结构中只有一种类型:Object .

public void Bar<T>(T item)
{
if (typeof(T).IsClass)
this.Foo((object) item);
}

编辑:

此外,在您所说的其中一条评论中,您添加了 class约束是实例化 T .你不需要那个,你需要的是 new constraint .

关于c# - 在运行时添加通用约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21665196/

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