- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
public object GetObjectToSerialize(object value, Type targetType)
{
var allProperties = value.GetType().GetProperties();
var passwordProperties = allProperties.Where(p => p.PropertyType == typeof(string))
.Where(p => p.Name.Contains("Password"))
.ToList();
var passwordWithoutEncryptedAttribute = passwordProperties
.Where(p => !p.GetCustomAttributes(typeof(EncryptedConfigurationItemAttribute), false).Any());
if (passwordWithoutEncryptedAttribute.Any())
{
throw new InvalidOperationException(SafeFormatter.Format(BackgroundJobsLocalization.Culture, BackgroundJobsLocalization.PasswordWithoutEncryptedAttribute));
}
foreach (var property in passwordProperties)
{
property.SetValue(value, null, null);
}
return value;
}
我经常使用这种方法。我该如何优化它?因为据我所知,value.GetType().GetProperties();
递归工作(对于基础对象,然后对于基础对象属性,然后是基础对象属性的每个属性,等等)
最佳答案
通过 memoizing它的结果。将结果保存在 Dictionary<Type, PropertyInfo[]>
中,然后在函数的开头检查您是否已经计算过它。如果是,返回 Dictionary<,>
的值.如果你想让它线程安全,使用 ConcurrentDictionary<Type, PropertyInfo[]>
.
类似于:
//private static readonly Dictionary<Type, PropertyInfo[]> PasswordProperties = new Dictionary<Type, PropertyInfo[]>();
private static readonly ConcurrentDictionary<Type, PropertyInfo[]> PasswordProperties = new ConcurrentDictionary<Type, PropertyInfo[]>();
public static object GetObjectToSerialize(object value, Type targetType) {
Type type = value.GetType();
PropertyInfo[] properties;
if (!PasswordProperties.TryGetValue(type, out properties))
{
properties = type.GetProperties()
.Where(p => p.PropertyType == typeof(string))
.Where(p => p.Name.Contains("Password"))
.ToArray();
var passwordWithoutEncryptedAttribute = properties
.Where(p => !p.GetCustomAttributes(typeof(EncryptedConfigurationItemAttribute), false).Any());
if (passwordWithoutEncryptedAttribute.Any()) {
throw new InvalidOperationException(); // SafeFormatter.Format(BackgroundJobsLocalization.Culture, BackgroundJobsLocalization.PasswordWithoutEncryptedAttribute));
}
PasswordProperties[type] = properties;
}
foreach (var property in properties)
{
property.SetValue(value, null, null);
}
return value;
}
如果您有权访问 value
的类型在编译时,它可以通过另一种方式进行优化,通过在静态泛型类的字段中进行内存:
public static class ObjectHelper
{
public static T GetObjectToSerialize<T>(T value)
{
foreach (var property in ObjectHelperInner<T>.Properties)
{
property.SetValue(value, null, null);
}
return value;
}
private static class ObjectHelperInner<T>
{
public static readonly PropertyInfo[] Properties;
static ObjectHelperInner()
{
PropertyInfo[] properties = typeof(T).GetProperties()
.Where(p => p.PropertyType == typeof(string))
.Where(p => p.Name.Contains("Password"))
.ToArray();
var passwordWithoutEncryptedAttribute = properties
.Where(p => !p.GetCustomAttributes(typeof(EncryptedConfigurationItemAttribute), false).Any());
if (passwordWithoutEncryptedAttribute.Any()) {
throw new InvalidOperationException(); // SafeFormatter.Format(BackgroundJobsLocalization.Culture, BackgroundJobsLocalization.PasswordWithoutEncryptedAttribute));
}
Properties = properties;
}
}
}
代码的第二个版本不会工作,如果你有:
object obj = something;
ObjectHelper.GetObjectToSerialize(obj);
它只有在你有以下条件时才有效:
SomeConcreteType obj = something;
ObjectHelper.GetObjectToSerialize(obj);
另一种可能的解决方案是在运行时生成(通过 Expression
树)一些代码来清理对象。它变得更快,但代码生成变得更慢。而且执行此操作的代码要复杂得多。
关于c# - 如何高效地使用 GetProperties()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35941598/
我正在查看 MSDN 作者在同一类的不同方法中使用以下代码的一些代码: if ( TypeDescriptor.GetProperties(ModelInstance)[propertyName] !
考虑以下代码。 Object obj; PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); PropertyInfo
我有一种方法。在Java 8中,它在我的Macbook Pro M2上运行得很好。。结果是:。现在在迁移到Java 17之后,我得到了。我预计这两个版本的行为是相同的。我遗漏了什么?。我原以为这个方法
我有一种方法。在Java 8中,它在我的Macbook Pro M2上运行得很好。。结果是:。现在在迁移到Java 17之后,我得到了。我预计这两个版本的行为是相同的。我遗漏了什么?。我原以为这个方法
I have this method我有一种方法 static String getArchSuffix() { String arch = System.getProperty(&qu
System.getProperty("os.name") and System.getProperty("os.version") returning windows 10, 10.0, in wi
System.getProperty("os.name") and System.getProperty("os.version") returning windows 10, 10.0, in wi
我创建了包含用户列表的java类(称为“usersList”并包含每个值的用户名和密码), 现在我创建一个 JSP 文件并指定 JavaBeans 的范围: 我想将 usersList 获取到一
public object GetObjectToSerialize(object value, Type targetType) { var allProperties = value.
本文实例汇总了Java的System.getProperty()方法获取信息的用法。分享给大家供大家参考。具体如下: 复制代码代码如下: System.out.prin
我试图遍历类中的每个属性,输出属性的名称和值。但是我的代码没有返回任何属性。 正在循环的类: public class GameOptions { public ushort Fps;
我正在尝试编写一个通用实用程序,以便从 .NET 外部通过 COM 使用(/skip long story)。无论如何,我正在尝试向 ExpandoObject 添加属性,并且需要将 Property
我正在尝试使用 gradle 版本 4.8+ 的 Java、Serenity-BDD 项目,但应用程序没有提取 -Denvironment 和 -Dservicebranches 的 CLI 参数。我
我有一个源模块: import _ from 'underscore' import {Observable} from 'rxjs' export default function (rxfb) {
当我调用方法 System.getProperties(); 并打印它们时,它给出一个包含键值对的大列表,无需设置属性。 Java 从哪里获取那些属性来自? 最佳答案 来自托管 Java 的操作系统(
在这行代码中,我使用 getProperty 方法: PrintWriter writer = new PrintWriter("~/4413/ctrl/geo.txt".replaceFirst("
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
在一个非常庞大的代码库中,我发现了以下代码片段 System.getProperty("some stuff")。我尝试在一些 .properties 文件中查找该属性,但找不到它。你们有什么想法可以
让我大吃一惊! 根据 groovy 的文档,groovy 可以使用“getProperty”方法来获取对象的属性。所以当我想改变获取特殊对象属性的行为时,我使用一个类别类来覆盖“getProperty
这个问题可能会说明我缺乏关于 Groovy 类如何工作的知识,但我试图自己解决这个问题,但没有运气。我想在一个类上创建一个 getProperty() 方法,这样我就可以以 Groovyish 的方式
我是一名优秀的程序员,十分优秀!