2011-11-15 38 views
5

Tôi có một lớp thực hiện giao diện. Tôi chỉ muốn kiểm tra các giá trị thuộc tính thực hiện giao diện của tôi.Chỉ nhận các thuộc tính thực hiện giao diện

Vì vậy, chúng ta hãy nói ví dụ tôi có giao diện này:

public interface IFooBar { 
    string foo { get; set; } 
    string bar { get; set; } 
} 

Và lớp này:

public class MyClass :IFooBar { 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public int MyOtherPropery1 { get; set; } 
    public string MyOtherProperty2 { get; set; } 
} 

Vì vậy, tôi cần phải thực hiện điều này, nếu không có sự dây ma thuật:

var myClassInstance = new MyClass(); 
foreach (var pi in myClassInstance.GetType().GetProperties()) { 
    if(pi.Name == "MyOtherPropery1" || pi.Name == "MyOtherPropery2") { 
     continue; //Not interested in these property values 
    } 
    //We do work here with the values we want. 

} 

Làm cách nào để thay thế điều này:

if(pi.Name == 'MyOtherPropery1' || pi.Name == 'MyOtherPropery2') 

Thay vì kiểm tra xem tên thuộc tính của tôi có là == đến chuỗi ma thuật hay không, tôi chỉ muốn kiểm tra xem thuộc tính có được triển khai từ giao diện của tôi hay không.

Trả lời

8

Tại sao nên sử dụng phản chiếu nếu bạn biết giao diện trước thời hạn? Tại sao không chỉ kiểm tra nếu nó thực hiện các giao diện sau đó đúc vào đó?

var myClassInstance = new MyClass(); 
var interfaceImplementation = myClassInstance as IFooBar 

if(interfaceImplementation != null) 
{ 
    //implements interface 
    interfaceImplementation.foo ... 
} 

Nếu bạn thực sự phải sử dụng phản chiếu, có được các tính chất vào loại giao diện, vì vậy sử dụng dòng này để có được thuộc tính:

foreach (var pi in typeof(IFooBar).GetProperties()) { 
+0

Tôi đang sử dụng giao diện để so sánh các giá trị của hai đối tượng mà thực hiện giao diện đó, nhưng có thể không cùng loại. Về cơ bản, kiểm tra bình đẳng giữa hai loại khác nhau. Hàm với mã này không chỉ trả về giá trị bằng/không bằng nhau, mà là sự khác biệt. Đó là lý do cho sự phản chiếu. –

+0

Đề xuất thứ hai của tôi có giúp ích gì không, chỉ cần lặp lại các thuộc tính trên loại giao diện? –

+0

Vâng, đó là những gì tôi cần. Tôi sẽ chấp nhận câu trả lời của bạn ngay khi thời gian chấp nhận hết hạn. Cảm ơn Paul. –

1

Có lẽ có một giao diện thứ cấp:

public interface IFooAlso { 
    int MyOtherProperty1 { get; set; } 
    string MyOtherProperty2 { get; set; } 
} 

Thêm giao diện thứ hai:

public class MyClass :IFooBar, IFooAlso { 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public int MyOtherPropery1 { get; set; } 
    public string MyOtherProperty2 { get; set; } 
} 

Và kiểm tra nó như thế này:

var myClassInstance = new MyClass(); 

if(myClassInstance is IFooAlso) { 
    // Use it 
} 
3

Tôi có xu hướng đồng ý rằng có vẻ như bạn muốn truyền đến giao diện, như Paul T. gợi ý.

Thông tin bạn đang hỏi, tuy nhiên, có sẵn trong loại InterfaceMapping, có sẵn từ phương pháp GetInterfaceMap của phiên bản Type. Từ

http://msdn.microsoft.com/en-us/library/4fdhse6f(v=VS.100).aspx

"Bản đồ giao diện biểu thị như thế nào một giao diện được ánh xạ vào các phương pháp thực tế trên một lớp mà thực hiện giao diện đó."

ví dụ:

var map = typeof(int).GetInterfaceMap(typeof(IComparable<int>)); 
Các vấn đề liên quan