2013-01-17 61 views
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>(); 

編譯。

+1

那麼,說什麼「有問題」的含義。粘貼* exact *編譯器錯誤或失敗指示符。 – 2013-01-17 23:41:19

回答

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個泛型類型參數;一個爲TripleDESCryptoProvider,另一個爲TripleDESCryptoServiceProvider