C# - 如何在没有约束的情况下从现有接口方法实例化具有约束的对象

问题描述 投票:0回答:1

我已经搜索并找到了当您有权更改现有接口定义时有意义的答案。就我而言,我没有这个能力。 我正在尝试使用泛型创建一个新对象,该泛型具有不受泛型方法约束的约束。 下面的代码说明了我想要做的事情(我可以在 MyImplementedClass 中进行反射或任何必要的操作,但其他的则更固定):

// This existing interface has no constraint (can't change)
public interface IExistingInterface
{
    void ExistingMethod<T>();
}

public class MyImplementedClass : IExistingInterface
{
    public void ExistingMethod<T>()
    {
        var howToDoThis = new ExistingClass<T>(); // Gives error that T must be a reference type
    }
}

// This existing class has the following constraint (can't change)
public class ExistingClass<T> where T : class
{
    
}
c# generics constraints
1个回答
0
投票

我只是在代码中实现该限制,一旦确保类型满足该约束,就创建适当的类型并创建该类型的实例:

public class MyImplementedClass : IExistingInterface
{
    public void ExistingMethod<T>()
    {
        if (!typeof(T).IsClass)
        {
            throw new InvalidOperationException();
        }

        var howToDoThis = Activator.CreateInstance(typeof(ExistingClass<>).MakeGenericType(typeof(T)));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.