C# 有没有一种方法可以通用地调用类属性?

C# 有没有一种方法可以通用地调用类属性?,c#,generics,C#,Generics,下面是一些来自LinqPad的精心设计的C#代码(我无法分享实际代码): void Main() { var d=新的演示文稿sue(); 抛出(()=>{bool result=!d.test1.Contains(“y”);}); 抛出(()=>{bool result=!d.test2.Contains(“y”);}); 抛出(()=>{bool result=!d.test3.Contains(“y”);}); } //您可以在此处定义其他方法、字段、类和名称空间 公开课示范课 { 字典测

下面是一些来自LinqPad的精心设计的C#代码(我无法分享实际代码):

void Main()
{
var d=新的演示文稿sue();
抛出(()=>{bool result=!d.test1.Contains(“y”);});
抛出(()=>{bool result=!d.test2.Contains(“y”);});
抛出(()=>{bool result=!d.test3.Contains(“y”);});
}
//您可以在此处定义其他方法、字段、类和名称空间
公开课示范课
{
字典测试;
公共字符串test1{get;}
公共字符串test2{get;}
公共字符串test3{get;}
公众示威
{
myTests=新字典()
{
{“test1”,“yes”},
{“test2”,“yes”},
{“test3”,“哦,耶!”}
};
test1=myTests[“test1”];
test2=myTests[“test2”];
test3=myTests[“test3”];
}
}
我正在使用NUnit进行测试,以检查每个属性是否符合相同的行为。问题是,正如你所看到的,它基本上是相同的测试,每次除了类字段我调用它。当我看到这类代码时,我总是想用泛型代码替换它,但我不知道如何以泛型方式获取每个属性。看起来我需要使用反射,但我希望有一些通用的方法来编写代码

我是说我在想这样的事情

public void TestField<T>()
{
   Assert.Throws<ArgumentOutOfRangeException>(() => {bool result = id.T.contains("y");}); 
}
public void测试字段()
{
抛出(()=>{bool result=id.T.contains(“y”);});
}

其中T将是字符串字段,但如果可能的话,我不知道如何做。如果您对我如何将代码干涸,您将不胜感激

使用lambda表达式将属性存储在列表中。然后迭代列表并测试每个元素

void Main()
{
    var d = new DemonstrateIssue();
    var properties = new List<Func<DemonstrateIssue,string>>
    {
        x => x.test1,
        x => x.test2,
        x => x.test3
    };

    foreach (var p in properties)
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => bool result = !p(d).Contains("y");});
    }
}
void Main()
{
var d=新的演示文稿sue();
var属性=新列表
{
x=>x.test1,
x=>x.test2,
x=>x.test3
};
foreach(属性中的var p)
{
抛出(()=>bool result=!p(d).Contains(“y”);});
}
}

您正在每个字段上运行相同的测试,对吗?为什么不把它们放到一个列表中并使用foreach循环呢?我对单元测试中的最佳实践有点陌生。在这种情况下,使用Func的列表而不仅仅是字符串列表有什么特别的原因吗?我提供的代码是在编译时绑定的。如果要使用字符串列表,则在运行时之前不会检查它们。
void Main()
{
    var d = new DemonstrateIssue();
    var properties = new List<Func<DemonstrateIssue,string>>
    {
        x => x.test1,
        x => x.test2,
        x => x.test3
    };

    foreach (var p in properties)
    {
        Assert.Throws<ArgumentOutOfRangeException>(() => bool result = !p(d).Contains("y");});
    }
}