Tôi đang cố tạo một phương thức sẽ đi qua danh sách các đối tượng chung và thay thế tất cả các thuộc tính của chúng thuộc loại string
, hoặc là null
hoặc trống với một sự thay thế.C#: Cách nhận tất cả các thuộc tính chuỗi công khai (cả nhận và đặt) của một loại
Làm cách nào để thực hiện điều này?
tôi có loại ... vỏ ... cho đến nay:
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);
}
}
}
Vì vậy, làm thế nào tôi tìm thấy tất cả các tính chất của một loại đó là:
- Trong số loại
string
- Có công
get
Có công
set
?
tôi làm lớp thử nghiệm này:
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; }
}
Sau đây không hoạt động:
var properties = typeof(TestSubject)
.GetProperties(BindingFlags.Instance|BindingFlags.Public)
.Where(ø => ø.CanRead && ø.CanWrite)
.Where(ø => ø.PropertyType == typeof(string));
Nếu tôi in ra tên của những tài sản tôi đạt được điều đó, tôi get:
PublicPublic PublicPrivate PrivatePublic
Nói cách khác, tôi nhận được hai thuộc tính quá nhiều.
Note: Đây có lẽ có thể được thực hiện một cách tốt nhất ... sử dụng foreach lồng nhau và phản ánh và tất cả đây ... nhưng nếu bạn có bất kỳ ý tưởng thay thế tuyệt vời, xin vui lòng cho tôi biết vì tôi muốn học!
Ví dụ của bạn trước hết sẽ thay thế * tất cả * giá trị, và thứ hai, thuộc tính CanWrite dường như không hoạt động theo cách chúng ta nghĩ ... =/ – Svish
CanWrite thực sự hoạt động theo cách cần thiết. Bạn có thể giải thích điều gì khiến bạn nghĩ ngược lại không? –
Như ví dụ của tôi cho thấy, một thuộc tính công khai được khai báo là tức làchuỗi công khai Something {get; private set;}, sẽ trả về true cho cả CanRead và CanWrite, mặc dù tôi không thể viết, vì setter là private. – Svish