C# PropertyDescriptor.GetValue(null)Object reference not set to an instance of an object
时间: 2023-09-26 21:10:29 浏览: 48
这个错误提示说明你尝试在一个空引用上调用 `PropertyDescriptor.GetValue()` 方法。`GetProperty()` 方法返回的是一个 `PropertyDescriptor` 对象,你需要确保这个对象不为空,然后再调用 `GetValue()` 方法。
例如,你可以使用以下代码来避免空引用错误:
```csharp
PropertyDescriptor property = TypeDescriptor.GetProperties(typeof(YourClass))["YourProperty"];
if (property != null)
{
object value = property.GetValue(null);
// 使用获取到的值进行其他操作
}
```
在这个示例中,我们首先获取 `YourProperty` 的 `PropertyDescriptor` 对象,并进行了空引用检查。只有当 `property` 不为空时,才调用 `GetValue()` 方法来获取属性的值。
相关问题
java propertydescriptor set
Java PropertyDescriptor 是一个用于操作 JavaBean 属性的类。它包含了一个属性的 getter 和 setter 方法的信息,可以通过它来获取或设置属性的值。
在 Java 中,一个属性可以通过 getter 和 setter 方法来访问和修改。而 PropertyDescriptor 就是用来获取和设置这些方法的。
使用 PropertyDescriptor 的 set 方法可以设置属性的值。通过给定一个目标对象和一个新的值,set 方法会自动查找到该属性对应的 setter 方法,并将新的值传递给它,从而修改属性的值。
以下是一个示例代码,演示了如何使用 PropertyDescriptor 的 set 方法来设置属性值:
```
public class Student {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) {
try {
Student student = new Student();
PropertyDescriptor pd = new PropertyDescriptor("name", Student.class);
Method setter = pd.getWriteMethod();
setter.invoke(student, "John");
System.out.println(student.getName()); // 输出 "John"
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
在上述代码中,通过 PropertyDescriptor 的构造函数指定了目标属性的名称和所属的类。然后通过 getWriteMethod 方法获取到该属性对应的 setter 方法。最后使用 invoke 方法调用 setter 方法,并传入新的属性值。
通过 PropertyDescriptor 的 set 方法,我们可以方便地修改属性的值,而无需自己手动调用 setter 方法。这样可以使代码更加简洁和易于维护。
BeanUtils.copyProperties忽略null值
可以使用BeanMapper或者在BeanUtils.copyProperties中传入一个自定义的属性过滤器来忽略null值。以下是两种方法的示例代码:
1. 使用BeanMapper忽略null值
```python
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.core.Converter;
public class BeanMapper {
private static final Map<String, BeanCopier> BEAN_COPIERS = new ConcurrentHashMap<>();
public static void copyProperties(Object source, Object target) {
String key = source.getClass().toString() + target.getClass().toString();
BeanCopier copier = null;
if (!BEAN_COPIERS.containsKey(key)) {
copier = BeanCopier.create(source.getClass(), target.getClass(), true);
BEAN_COPIERS.put(key, copier);
} else {
copier = BEAN_COPIERS.get(key);
}
copier.copy(source, target, new Converter() {
@Override
public Object convert(Object value, Class target, Object context) {
if (value == null) {
if (target == String.class) {
return "";
} else if (target == Integer.class) {
return 0;
} else if (target == Long.class) {
return 0L;
} else if (target == Double.class) {
return 0.0;
} else if (target == Float.class) {
return 0.0f;
} else if (target == Boolean.class) {
return false;
} else {
return null;
}
} else {
return value;
}
}
});
}
}
```
使用示例:
```python
Source source = new Source();
source.setName("test");
source.setAge(18);
source.setAddress(null);
Target target = new Target();
BeanMapper.copyProperties(source, target);
System.out.println(target.getName()); // 输出:test
System.out.println(target.getAge()); // 输出:18
System.out.println(target.getAddress()); // 输出:null
```
2. 在BeanUtils.copyProperties中传入自定义属性过滤器忽略null值
```python
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Set;
public class CopyUtils {
public static void copyPropertiesIgnoreNull(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}
private static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}
```
使用示例:
```python
Source source = new Source();
source.setName("test");
source.setAge(18);
source.setAddress(null);
Target target = new Target();
CopyUtils.copyPropertiesIgnoreNull(source, target);
System.out.println(target.getName()); // 输出:test
System.out.println(target.getAge()); // 输出:18
System.out.println(target.getAddress()); // 输出:null
```