3

私はインターフェースを持っています

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

     ICryptoTransform GetEncryptor();

     T GetAlgorithm();
}

私は実装を持っています

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();
    }
}

上記の実装を実装するクラスがあります

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));
        }
    }
}

クラスのインスタンス化に問題がありますCryptoWork<T> where T : ICrypto<T>, new()

ない

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

または

var cryptoWork = new CryptoWork < TripleDESCryptoProvider > ();

コンパイルします。

4

1 に答える 1

6

指定しました:

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

そしてあなたは使用しています

new CryptoWork<TripleDESCryptoProvider>();

それが機能するためには、次のものが必要です。

TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>

T=以降TripleDESCryptoProvider

しかし、あなたは持っています:

TripleDESCryptoProvider : ICrypto<TripleDESCryptoServiceProvider>

およびパブリックパラメーターレスコンストラクター(これはあなたが持っています)。オプション:

  • 作るTripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>
  • APIをリファクタリングします
  • CryptoWork型に2つのジェネリック型パラメーターを持たせる。1つはTripleDESCryptoProvider、、もう1つはTripleDESCryptoServiceProvider
于 2013-01-17T23:46:06.043 に答える