【发布时间】:2013-07-26 16:32:42
【问题描述】:
假设您在 C# 中有一个函数,它允许您像这样打印出模型的属性:
public void Export<T>(List<T> list)
{
// get properties of Model
Type modelType = typeof(T);
var modelInstance = Activator.CreateInstance(modelType);
PropertyInfo[] properties = modelInstance.GetType().GetProperties();
foreach (var property in properties)
{
if (property.CanRead)
PRINTOUT(property.Name);
}
foreach (var entity in list)
{
foreach (var property in properties)
{
if (property.CanRead)
PRINTOUT(property.GetValue(entity, null));
}
}
}
现在,这个函数在一个控制器中,所以,正如我所读到的,它是一个公开的 HTTP 端点!恶意用户是否可以向PRINTOUT 他不应该看到的属性提问?
为了避免这种情况,我想从另一个控制器调用这个函数,它传入一个非常特定的类型。
例如,控制器Customers 中的PrintoutCustomers 调用该函数,而控制器Products(使用PrintoutProducts 操作)可以调用相同的确切函数,但传入产品列表(而不是客户)。
然后,用户将拥有一个可公开访问的 HTTP 端点的具体列表,其中没有一个会允许他做任何有害的事情。
我希望该功能在我的所有控制器之间私有和共享:这可能吗?我可以这样做吗?还是我真的必须在我需要的任何地方复制粘贴相同的方法(并且浪费我的时间尝试使用 typeof 和反射使其通用)?
【问题讨论】:
-
这样做没有意义:
var modelInstance = Activator.CreateInstance(modelType);你已经有了Type modelType = typeof(T);的类型,所以就这样做modelType.GetProperties(); -
我已经尝试过,但这给出了 2 个不同的结果!如果我不实例化该类,由于奇怪的原因,属性是不同的。如果我不实例化,我会得到一堆我一生中从未写过的东西:如果我实例化,我会看到我在类中指定的属性。
-
@Saturnix:真的不应该这样。一定有其他事情发生。
-
那么我认为这将成为另一个问题的对象,因为它也困扰着我......我发誓这就是我所看到的:getproperties of type = crap。获取实例的属性 = 正确。
-
@Saturnix:很可能,您所做的是以下内容:
Type modelType = typeof(T); var properties = modelType.GetType().GetProperties();。注意GetType?不对,modelType已经是一个类型了。
标签: c# security system.reflection