C# 如何测试属性是否来自其他程序集

C# 如何测试属性是否来自其他程序集,c#,unit-testing,reflection,internal,func,C#,Unit Testing,Reflection,Internal,Func,我正在尝试测试此方法: [Test] public void Test_GetReferenceValue() { Person person= new Person() { Name = "PJ" }; PersonalProperty<Person> personalProperty = new PersonalProperty<Person>(); var result = personalProperty.GetReferenceValue(perso

我正在尝试测试此方法:

[Test]
public void Test_GetReferenceValue()
{
  Person person= new Person() { Name = "PJ" };
  PersonalProperty<Person> personalProperty = new PersonalProperty<Person>();
  var result = personalProperty.GetReferenceValue(person);
  Assert.AreEqual("PJ", result);
}
我试图找到访问器属性的来源,但在另一个程序集中找到了它:

public class PersonalProperty<TOwner> : Property<TOwner, Person>
where TOwner : class
{
  public virtual Func<TOwner, TProperty> Accessor { get; internal set; }
}
这是为Func委托放置一个定义/方法。。但是,我不能这样做,因为访问器是内部设置的。也就是说,如果我在另一个程序集中(我现在正在),我无法设置它。我不能成为访问者程序集的好友,因为我不允许更改任何代码。我只能在另一个项目/程序集中创建测试


那么我将如何测试GetReferenceValue呢?反射有帮助吗?

是的,你可以用反射来做。此函数可以忽略setter访问修饰符来设置属性值:

public static void SetPropertyValue(object instance, string property, object value)
{
    instance.GetType().GetProperty(property).SetValue(instance, value, null);
}
用法:

Func<Person, Person> accessor = p => p;
SetPropertyValue(personalProperty, "Accessor", accessor);
Func访问器=p=>p;
SetPropertyValue(personalProperty,“访问者”,访问者);

无论如何,这表明
PersonalProperty
类设计可能有问题。

是的,可以使用反射来完成。此函数可以忽略setter访问修饰符来设置属性值:

public static void SetPropertyValue(object instance, string property, object value)
{
    instance.GetType().GetProperty(property).SetValue(instance, value, null);
}
用法:

Func<Person, Person> accessor = p => p;
SetPropertyValue(personalProperty, "Accessor", accessor);
Func访问器=p=>p;
SetPropertyValue(personalProperty,“访问者”,访问者);

不管怎样,这表明
PersonalProperty
类设计可能有问题。

OMG。。。事实上,我之前尝试过,但没有成功,因为我用了错误的方法:.SetValue(personalProperty,p=>p,null);英雄联盟所以lambda是不允许的,直到现在我才知道Func中的x=p=>p;实际上是一个物体。。。谢谢你!天啊。。。事实上,我之前尝试过,但没有成功,因为我用了错误的方法:.SetValue(personalProperty,p=>p,null);英雄联盟所以lambda是不允许的,直到现在我才知道Func中的x=p=>p;实际上是一个物体。。。谢谢你!