2012-01-21 34 views
6

Có cách nào để truy cập thành viên bằng một chuỗi (đó là tên) không?Làm thế nào để truy cập thành viên lớp bằng chuỗi trong C#?

Ví dụ: nếu mã tĩnh là:

classA.x = someFunction(classB.y); 

nhưng tôi chỉ có hai dây:

string x = "x"; 
string y = "y"; 

Tôi biết trong JavaScript bạn chỉ có thể làm:

classA[x] = someFunction(classB[y]); 

Nhưng làm thế nào để làm điều đó trong C#?

Ngoài ra, có thể xác định tên theo chuỗi không?

Ví dụ:

string x = "xxx"; 
class{ 
    bool x {get;set} => means bool xxx {get;set}, since x is a string 
} 

CẬP NHẬT, để tvanfosson, tôi không thể có được nó làm việc, đó là:

public class classA 
{ 
    public string A { get; set; } 
} 
public class classB 
{ 
    public int B { get; set; } 
} 

var propertyB = classB.GetType().GetProperty("B"); 
var propertyA = classA.GetType().GetProperty("A"); 
propertyA.SetValue(classA, someFunction(propertyB.GetValue(classB, null) as string), null); 

Trả lời

10

Bạn cần phải sử dụng reflection.

var propertyB = classB.GetType().GetProperty(y); 
var propertyA = classA.GetType().GetProperty(x); 

propertyA.SetValue(classA, someFunction(propertyB.GetValue(classB,null) as Foo), null); 

nơi Foo là loại tham số someFunction yêu cầu. Lưu ý rằng nếu someFunction mất object bạn không cần truyền. Nếu loại là loại giá trị thì bạn sẽ cần sử dụng (Foo)propertyB.GetValue(classB,null) để truyền giá trị đó.

Tôi giả định rằng chúng tôi đang làm việc với các thuộc tính chứ không phải các trường. Nếu đó không phải là trường hợp thì bạn có thể thay đổi để sử dụng các phương thức cho các trường thay vì thuộc tính, nhưng bạn có thể nên chuyển sang sử dụng các thuộc tính thay vì các trường không thường được công khai.

Nếu loại không tương thích, nghĩa là, someFunction không trả về loại tài sản của A hoặc không thể chuyển nhượng được, thì bạn sẽ cần chuyển đổi sang loại thích hợp. Tương tự, nếu loại B không tương thích với tham số của hàm, bạn sẽ cần thực hiện tương tự.

propetyA.SetValue(classA, someFunction(Convert.ToInt32(propertyB.GetValue(classB,null))).ToString()); 
+0

không thể làm việc, vui lòng kiểm tra cập nhật của tôi –

+1

@EricYin Tôi đoán tôi cũng giả định rằng các loại tương thích. Nếu các loại không tương thích thì bạn sẽ cần phải chuyển đổi chúng thành các loại tương thích. Một cách sẽ sử dụng 'Chuyển đổi', giả sử một chuyển đổi tồn tại. – tvanfosson

+0

Đã làm việc, cảm ơn. Nó sẽ hoạt động rất thấp? Hoặc đó là giải pháp duy nhất và không có sự lựa chọn nào là –

Các vấn đề liên quan