使用反射获取类构造函数的参数

时间:2018-12-07 11:38:45

标签: c# unit-testing reflection

我正在为一个类编写单元测试,并且在检查每个参数是否为null时希望有单独的异常消息。

我不知道如何实现以下GetParameterNameWithReflection方法:

public class struct SUT
{
    public SUT(object a, object b, object c)
    {
        if (a == null)
        {
            throw new ArgumentNullException(nameof(a));
        }

        // etc. for remaining args

        // actual constructor code
    }    
}

[TextFixture]
public class SutTests
{
    [Test]
    public void constructor_shouldCheckForFirstParameterNull()
    {
        var ex = Assert.Throws<ArgumentNullException>(new Sut(null, new object(), new object()));

        string firstParameterName = GetParameterNameWithReflection(typeof(SUT);)

        Assert.AreEqual(firstParameterName, ex.ParamName);
    }
}

作为奖励,欢迎对此类型测试的适当性发表评论!

2 个答案:

答案 0 :(得分:6)

怎么样:

static string GetFirstParameterNameWithReflection(Type type)
{
    return type.GetConstructors().Single().GetParameters().First().Name;
}

这断言只有一个构造函数,获取参数,断言至少有一个这样的构造函数并返回名称。

答案 1 :(得分:2)

此方法将返回第一个构造函数的第一个参数名称。您可以对此进行扩展,以处理多个构造函数和不同的参数。它使用ParameterInfo类。

    public string GetFirstParameterNameWithReflection(Type t)
    {
        return t.GetConstructors()[0].GetParameters()[0].Name;
    }