这可能是一个愚蠢的问题,但是有可能实现这种情况吗? 我有一个课程,例如
public class Car
{
public string Make {get;set;}
public string Model {get;set;}
public decimal Price {get;set;}
public User Owner {get;set;}
}
其中owner是其他地方的属性设置,而不是我拥有的功能
public static class Operations
{
public static void CalculateTaxes(decimal price)
{
....some code goes here and I want using reflection to access Owner,supposing that i will always pass price of a car
}
}
该函数将被这样调用
var car =new Car(){Price=25000,Make="BMW",Model="X6",Owner=new User(){"Sam Johnson"}};
Operations.CalculateTaxes(car.Price);
这只是一个伪造的代码,在真实的应用程序中,我不想传递整个实例,而是想要获得车主的控制权。这是一个真实的目标吗?
答案 0 :(得分:2)
您的问题的答案很简短:否。 在任何情况下,这都是不可能的-因为C#的设计方式。谢谢Mads。
想象一下将整数传递给受感染的第三方库的安全隐患,并且这样做会意外泄漏用户凭据。
这里的真正问题是设计问题。 您的代码不适合您的应用程序的需求。 重新考虑您的设计。
还要注意,尽管反射有很多用例并可以实现很多功能, 在这样简单的情况下-通常是过度杀伤力。 将反射用于元编程-而不用于业务逻辑。
答案 1 :(得分:0)
使用值类型decimal
不仅不能做到这一点。甚至类之类的引用类型也不起作用,因为(AFAIK)类无法跟踪指向它们的所有对象(同一类实例可以是多个所有者的属性)。
幸运的是,有一个简单的解决方案-传递汽车实例本身,并从中提取价格。
public static void CalculateTaxes(Car car)
{
decimal price = car.Price;
...
}
如果需要使用Car
以外的类型调用此方法,则可以创建一个适当的接口并让Car
来实现它。例如具有Owner
属性的接口。但是,由于您试图获得更多的汽车性能,因此我假设这将仅用于类型Car
。
答案 2 :(得分:0)
我想到了这个解决方案,但现在正是我想要的,因为会有很多不同类型的属性,并且每个属性都应在不同的函数中进行处理,而我想使用点符号传递它们,而不是像CalculateTax(car,"Price")
我认为,最好的解决方案将是使用局部函数,该函数可以访问整个对象,例如
public static class Operations
{
public static void Operate(Car car)
{
calculateTaxes(car.Price);
void calculateTaxes(decimal price)
{
car.Owner is accessible here
}
void rateMake(string make)
{
so on and so on
}
}
}