通常我們的業務交給暴露給外部使用的時候,一般情況會采用接口的方式,但有時候,我們也會也會為對外暴露的業務接口提供默認的操作方法。
很多時候,我們在別人提供的接口的默認方法時候,很難找到該接口的對應該方法(比較規范的編程方式還好找,如果是雜草式的編程方式的話,估計找半天都找不到)
由此,我們對該問題展開討論解決。
我們都知道“接口是不能實例化接口”的。
如(錯誤):
public interface IErrorFace
{
void Error();
}
//錯誤的使用接口方式:
IErrorFace ef = new IErrorFace();
但我們可以通過實現接口來完成這一個功能。
如(正確):
public interface IErrorFace
{
void Error();
}
public class ErrorFace:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new ErrorFace();
ief.Error();//已在ErrorFace實現接口IErrorFace的方法
但是我們采用了上面的正確方法,最終我們還是需要很努力的找出該接口對應的默認方法,那有沒有一種方法可以按上面錯誤的方式使用,又能按上面正確方式執行里面的方法呢?
下面我們請出幾個特性來解決這一難題:ComImport,Guid,CoClass,這些特性位於:using System.Runtime.InteropServices;命名空間中
我們將以上兩種方式合並得到:
[ComImport]
[Guid("12341234-1234-1234-1234-123412341234")]
[CoClass(typeof(ErrorFace))]
public interface IErrorFace
{
void Error();
}
public class ErrorFace:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new IErrorFace();
ief.Error();
IErrorFace ief1 = new ErrorFace();
ief1.Error();
當然,我們也新寫一個對象來繼續這個接口:
public class ErrorFaceV1:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new ErrorFaceV1();
ief.Error();//在ErrorFace實現接口的方法
但是有一點就是,這種接口的語法糖無法在外部識別其CoClass通過InteropClass編譯時,只能通過內部編譯別。
如:
public class ErrorFaceV2
{
public void ErrorUse()
{
//TODO
}
}
以上的代碼並沒有繼承IErrorFace接口,但它卻可以編寫如下(在編譯過程中不會報錯):
//使用接口:
IErrorFace ief = new ErrorFaceV1();
ErrorFaceV2 v2=(ErrorFaceV2)ief;//該轉換在執行過程出錯,在編譯過程不會出錯。
ief.Error();//在ErrorFace實現接口的方法
