2009-07-14 28 views
7

Trong C#, giả sử bạn có một đối tượng (ví dụ: myObject) là một thể hiện của lớp MyClass. Chỉ sử dụng myObject, bạn sẽ truy cập vào thành viên tĩnh của MyClass như thế nào?C# - làm thế nào để truy cập một thành viên tĩnh của lớp, được đưa ra một thể hiện của lớp đó?

class MyClass 
    { 
    public static int i = 123 ; 
    } 

class MainClass 
    { 
    public static void Main() 
     { 
     MyClass myObject = new MyClass() ; 
     myObject.GetType().i = 456 ; // something like this is desired, 
         // but erroneous 
     } 
    } 
+6

Bạn có thể giải thích lý do tại sao bạn không thể tham chiếu trực tiếp hơn không? Có một chút mùi mã ở đây. –

+1

Phương thức của tôi nhận một tham số thuộc kiểu Block, nhưng đối số thực sự truyền là một lớp thuộc một trong số các lớp con * của Block và mỗi lớp con phải có bản sao riêng của thành viên tĩnh (vai trò này được chơi) bởi "i" trong mã câu hỏi của tôi). – JaysonFix

+3

IMHO, thường là câu trả lời hay nhất cho "Làm cách nào để thực hiện việc này?" là "Đừng làm thế." Tôi mạnh mẽ nghi ngờ đây là một trong những lần đó. – tnyfst

Trả lời

24

Bạn sẽ phải sử dụng phản ánh:

Type type = myObject.GetType(); 
FieldInfo field = type.GetField("i", BindingFlags.Public | 
            BindingFlags.Static); 
int value = (int) field.GetValue(null); 

Tôi thường muốn cố gắng tránh làm điều này mặc dù ... nó rất giòn. Dưới đây là một sự thay thế sử dụng thừa kế bình thường:

public class MyClass 
{ 
    public virtual int Value { get { return 10; } } 
} 

public class MyOtherClass : MyClass 
{ 
    public override int Value { get { return 20; } } 
} 

, vv

Sau đó, bạn chỉ có thể sử dụng myObject.Value để có được giá trị đúng.

+0

Với các chi tiết được đăng, nó có vẻ sẽ bị giết vì anh ta chỉ có thể tham khảo MyClass.StaticMember Nó chỉ thực sự quan trọng nếu myObject có thể nhiều hơn một Lớp và bạn không thể biết được sự phát triển nào. – Robert

+0

@Robert: Đó chính xác là tình huống của anh ấy. Xem nhận xét cho câu hỏi. –

+0

Nhưng nó phải là tĩnh. Tôi cũng đang đối mặt với vấn đề này. – mireazma

4

Bạn chỉ cần có để sử dụng: MyClass.i

Để xây dựng một chút, để sử dụng một thành viên tĩnh, bạn cần phải biết về lớp. Và có một tham chiếu đối tượng là không liên quan. Cách duy nhất một đối tượng sẽ có vấn đề là khi bạn sẽ có 2 lớp riêng biệt mà cả hai đều có một thành viên tìm kiếm giống hệt nhau:

class A { public static int i; } 
class B { public static int i; } 

Nhưng A.iB.i là lĩnh vực hoàn toàn khác nhau, không có mối quan hệ logic giữa chúng. Ngay cả khi B kế thừa từ A hoặc ngược lại.

+1

"chỉ sử dụng myObject" ... – Joey

+0

Tôi muốn có thể truy cập thành viên tĩnh i chỉ sử dụng tham chiếu myObject. – JaysonFix

+1

Johannes, tôi đọc điều đó, nhưng đừng nghĩ rằng đó là một câu hỏi thực tế (istic). –

10

Nếu bạn có quyền kiểm soát MyClass và cần thực hiện việc này thường xuyên, tôi sẽ thêm thuộc tính thành viên cho phép bạn truy cập.

class MyClass 
{ 
    private static int _i = 123; 

    public virtual int I => _i; 
} 
Các vấn đề liên quan