C#:如何让所有的公共(get和set)字符串类型的属性 [英] C#: How to get all public (both get and set) string properties of a type
问题描述
我试图做出将通过通用对象的列表,并取代其类型的所有属性字符串
要么是无效的方法
或空用的替代品。
I am trying to make a method that will go through a list of generic objects and replace all their properties of type string
which is either null
or empty with a replacement.
如何是一个很好的办法做到这一点?
How is a good way to do this?
我有这样的... ...壳至今:
I have this kind of... shell... so far:
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
var properties = typeof(T).GetProperties( -- What BindingFlags? -- );
foreach(var p in properties)
{
foreach(var item in list)
{
if(string.IsNullOrEmpty((string) p.GetValue(item, null)))
p.SetValue(item, replacement, null);
}
}
}
那么,如何找到属于一个类型的所有属性:
So, how do I find all the properties of a type that are:
- 键入
字符串
- 的公共
GET
-
有市民
设置
我做了这个测试类:
class TestSubject
{
public string Public;
private string Private;
public string PublicPublic { get; set; }
public string PublicPrivate { get; private set; }
public string PrivatePublic { private get; set; }
private string PrivatePrivate { get; set; }
}
以下不工作:
var properties = typeof(TestSubject)
.GetProperties(BindingFlags.Instance|BindingFlags.Public)
.Where(ø => ø.CanRead && ø.CanWrite)
.Where(ø => ø.PropertyType == typeof(string));
如果我打印出来的那些属性我到那里的名,我得到:
If I print out the Name of those properties I get there, I get:
PublicPublic
公私
PrivatePublic
PublicPublic PublicPrivate PrivatePublic
在换句话说,我得到两个属性太多。
In other words, I get two properties too much.
的注意:这或许可以以更好的方式...使用嵌套的foreach和反思,并都在这里做...但如果你有任何伟大的替代的想法,请让我知道因为我想学!的
Note: This could probably be done in a better way... using nested foreach and reflection and all here... but if you have any great alternative ideas, please let me know cause I want to learn!
推荐答案
您code重写。不使用LINQ,也无功。
Your code rewritten. Does not use LINQ nor var.
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo p in properties)
{
// Only work with strings
if (p.PropertyType != typeof(string)) { continue; }
// If not writable then cannot null it; if not readable then cannot check it's value
if (!p.CanWrite || !p.CanRead) { continue; }
MethodInfo mget = p.GetGetMethod(false);
MethodInfo mset = p.GetSetMethod(false);
// Get and set methods have to be public
if (mget == null) { continue; }
if (mset == null) { continue; }
foreach (T item in list)
{
if (string.IsNullOrEmpty((string)p.GetValue(item, null)))
{
p.SetValue(item, replacement, null);
}
}
}
}
这篇关于C#:如何让所有的公共(get和set)字符串类型的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!