传递没有构造函数作为参数的类型

时间:2014-05-12 21:31:49

标签: c#

我一直在使用不同的System.Security.Cryptography哈希函数来了解不同哈希系统的密钥长度。为此,我考虑编写一个基于参数返回密钥大小的方法。 (返回密钥大小不是问题,这就是让我问这个问题的原因)

我虽然这个:

// I know I could use the interface as the type of T but let's define it as dynamic for now 
public static Byte[] Size(dynamic T) {

    return T.Create().ComputeHash(Encoding.Default.GetBytes("hello"));
}

现在,由于这些哈希函数(哈希生成类型)没有构造函数,我不能像

那样使用这个方法
 Size(new MD5()); // This is wrong coz there is no constructor

我无法传递类型:

Size(MD5); // Error 

如果我想直接将这些类型作为参数传递而不首先声明它们并像MD5 md5Size(md5)那样传递它们,我究竟需要做什么。 如果可能的话,我只是很好奇。

3 个答案:

答案 0 :(得分:2)

你可以借助反射

来做到这一点
var size = Size<MD5>();

public static Byte[] Size<T>()
{
    dynamic hashFxn = typeof(T).InvokeMember("Create",BindingFlags.Static| BindingFlags.Public | BindingFlags.InvokeMethod,null,null,null);
    return hashFxn.ComputeHash(Encoding.Default.GetBytes("hello"));
}

答案 1 :(得分:0)

您无法直接创建MD5类的实例,因为它被标记为抽象。相反,您应该创建一个继承MD5的类的实例。

MD5Cng内有两个选项,MD5CryptoServiceProviderSystem.Security.Cryptography

现在,您可以传递Size(new MD5CryptoServiceProvider()),但它会在运行时失败,因为CreateMD5没有公开实例MD5CryptoServiceProvider方法。

修改您的方法以取HashAlgorithm代替dynamic并删除Create方法调用:

public static Byte[] Size(HashAlgorithm T) {

    return T.ComputeHash(Encoding.Default.GetBytes("hello"));
}

答案 2 :(得分:0)

MD5是一个抽象类,因此您需要提供一个具体的子类。你可以这样做:

public static byte[] Size<T>() where T : HashAlgorithm, new()
{
    using (var hash = new T())
    {
        return hash.ComputeHash(Encoding.Default.GetBytes("hello"));
    }
}

并使用它:

var bytes = Size<MD5CryptoServiceProvider>();