gpt4 book ai didi

java - 将带有 'Class' 参数的 Java 泛型方法转换为 C# 实现

转载 作者:行者123 更新时间:2023-11-30 10:52:09 24 4
gpt4 key购买 nike

我正在将 Java API 转换为 C#,我有这样的方法:

public void addSpecificImplementation(String name, Class<? extends SomeInterface> implClass)

我知道 Type 等同于 C# 中的 java.lang.Class。我不知道如何编写此方法来获取“类型”的参数,并限制它必须是特定接口(interface)的子类型。这是如何在 C# 中完成的?

这是实际的 java 实现:

public void addSpecificImplementation(String name, Class<? extends SomeInterface> implClass) {
Constructor<BeanT> ctor = implClass.getConstructor();
myInstance = ctor.newInstance();
..... add the instance to some data structure.....
}

最佳答案

奇怪的是Class<? extends SomeInterface>而不是实现它。但这对我们的情况没有必要。 addSpecificImplementation 采用应从 SomeInterface 派生的类类型并有一个无参数的构造函数。

下一个代码实际上与原始代码不同,因为它可以抛出运行时错误而不是 Java 代码,Java 代码不会使用相同的约束进行编译,但它最大限度地重复了 Java 代码的概念。

首先我们需要检查类型是actually inherits from SomeInterface .

接下来我们将尝试get default constructor .

最后我们可以 call constructor实例化新对象。

public void AddSpecificImplementation<T>(String name, Type implClass)
where T : SomeInterface
{
var baseType = typeof (T);
if (!implClass.IsAssignableFrom(baseType))
throw new ArgumentException(String.Concat("implClass does not implement ", baseType.Name), "implClass");

var constructor = implClass.GetConstructor(Type.EmptyTypes);
if (constructor == null)
throw new ArgumentException(String.Concat(baseType.Name, " has no default constructor"), "implClass");

var myInstance = (T) constructor.Invoke(new object[0]);
// add the instance to some data structure
}

关于java - 将带有 'Class<? extends Something>' 参数的 Java 泛型方法转换为 C# 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457848/

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