简体   繁体   English

无法实例化泛型类

[英]Cannot instantiate a generic class

I have an Interface 我有一个界面

public interface ICrypto<T> : IDisposable
{
     ICryptoTransform GetDecryptor();

     ICryptoTransform GetEncryptor();

     T GetAlgorithm();
}

I have an implementation 我有一个实现

public class TripleDESCryptoProvider : ICrypto<TripleDESCryptoServiceProvider>
{

    public TripleDESCryptoProvider() { }

    public ICryptoTransform GetDecryptor()
    {
        return GetAlgorithm().CreateDecryptor();
    }

    public ICryptoTransform GetEncryptor()
    {
        return GetAlgorithm().CreateEncryptor();
    }

    public TripleDESCryptoServiceProvider GetAlgorithm()
    {
     ...
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

i have a class that implements implementation above 我有一个实现上面的实现的类

public class CryptoWork<T> where T : ICrypto<T>, new()
{
    protected static T _keyStore;

    public static T KeyStore
    {
        get
        {
            if (_keyStore == null)
            {
                _keyStore = new T();
            }
            return _keyStore;
        }
    }

    /// <summary>
    /// Encrypt a byte array
    /// </summary>
    public string Encrypt(string input)
    {
        byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);
        using (var encryptor = KeyStore.GetEncryptor())
        {
            return Convert.ToBase64String(encryptor.TransformFinalBlock(inputArray, 0, inputArray.Length));
        }
    }

    /// <summary>
    /// Decrypt a byte array
    /// </summary>
    public string Decrypt(string input)
    {
        byte[] inputArray = Convert.FromBase64String(input);
        using (var encryptor = KeyStore.GetDecryptor())
        {
            return UTF8Encoding.UTF8.GetString(encryptor.TransformFinalBlock(inputArray, 0, inputArray.Length));
        }
    }
}

I am having problem instantiating class CryptoWork<T> where T : ICrypto<T>, new() : 我有问题实例化类CryptoWork<T> where T : ICrypto<T>, new()

Neither 也不

 var cryptoWork = new CryptoWork < ICrypto < TripleDESCryptoProvider > > ();

nor 也不

var cryptoWork = new CryptoWork < TripleDESCryptoProvider > ();

compiles. 编译。

You have specified: 您已指定:

CryptoWork<T> where T : ICrypto<T>, new()

and you are using 而你正在使用

new CryptoWork<TripleDESCryptoProvider>();

For that to work, we would need: 要实现这一目标,我们需要:

TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>

(since T = TripleDESCryptoProvider ) (因为T = TripleDESCryptoProvider

But you have: 但是你有:

TripleDESCryptoProvider : ICrypto<TripleDESCryptoServiceProvider>

and a public parameterless constructor (which you have). 和一个公共无参数构造函数(你有)。 Options: 选项:

  • make TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider> 制作TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>
  • refactor the API 重构API
  • make the CryptoWork type have 2 generic type parameters; 使CryptoWork类型有2个泛型类型参数; one for the TripleDESCryptoProvider , another for the TripleDESCryptoServiceProvider 一个用于TripleDESCryptoProvider ,另一个用于TripleDESCryptoServiceProvider

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM