我想知道如何使用Xamarin可移植类库的反射将属性设置为嵌套类。
我正在研究一个反映Xamarin可移植类库的项目。
我有这段代码:
public class Customer
{
public string Name { get; set; }
public string FirstName { get; set; }
public int Id { get; set; }
}
public class Invoice
{
public string Description { get; set; }
public int Id { get; set; }
public Customer Person { get; set; }
//New Edit...
//Clases...
// ... More classes
public OtherClass N-1 {get; set}
public MoreClases N {get;set;}
}
另一方面我有这个功能:
public void TestCode()
{
var myCustomer = new Customer()
{
FirstName = "qwerty",
Name = "asdfgh",
Id = 1
};
var myInvoice = new Invoice()
{
Description = "chocos",
Id = 1,
Person = myCustomer,
};
var properties = myInvoice.GetType().GetRuntimeProperties();
foreach (var property in properties)
{
var value = property.GetValue(myInvoice);
if (value != null)
{
if (property.PropertyType.IsGenericParameter)
{
//Have Generic parameters
}
else
{
//How I Know if my class == person???
// EDIT:
// If I Use typeof I must check all clases..
}
}
}
}
当我有字符串属性并使用(例如)GetRuntimeProperties()时,此函数返回大约8个属性,因此问题是:
我怎么知道这个属性是我的班级?
其他例子: 我如何知道该属性是否属于我的班级?
谢谢
编辑:
发票和客户就是例子。现在主要的想法是使用泛型,其类型很明显。
我想在所有情况下使用反射。
谢谢
编辑2: 我在示例中添加了更多代码。
我希望自己很清楚。
谢谢。
答案 0 :(得分:0)
示例中的所有属性和类都是公共的,应该是可见的,并且可以从外部访问。所以myInvoice.Person.Name
是可访问的。从反射角度来看,您可以通过PropertyType
PropertyInfo
属性访问该类型
即property.Name == "person" && property.PropertyType == typeof(Customer)
foreach (var property in properties)
{
var propertyType = property.PropertyType;
var value = property.GetValue(myInvoice);
if (value != null)
{
if (propertyType.IsGenericParameter)
{
//Have Generic parameters
}
else
{
//How I Know if my class == person
if(propertyType.Name == "Person" && propertyType = typeof(Customer)){
// class == person
}
}
}
}
OR
foreach (var property in properties)
{
var propertyType = property.PropertyType;
var value = property.GetValue(myInvoice);
if (value != null)
{
if(value is Customer) {
// class == person
var person = value as Customer;
var name = person.Name;
}
}
}
答案 1 :(得分:0)
您可以检查PropertyInfo的名称,并将其与您要确认的属性(Person)进行比较。所以用以下内容替换你的评论:
if (property.Name == "Person")
{
// This is a Person PropertyInfo.
Person person = value as Person;
if (person == null)
{
// This is not expected. Log and return
}
//Now you can access person.Name
}