2013-01-16 86 views
0

我有一個靜態方法,其內部代碼能夠處理多個不同的類。不過,我不確定如何在運行時將類放入方法中。C# - 一個方法參數可以是一類變量類型嗎?

例如可以說我有ClassA和ClassB的

我的方法可與這些類的工作,所以我想的參數看起來像。

public static void MyMethod(Object obj) 
{ 
    //...obj is either ClassA or ClassB 
    //...do work on variable class 
} 

但我不斷收到無效的參數消息時,我嘗試要麼

ClassA a = new ClassA(); 
MyMethod(a); 

ClassB b = new ClassB(); 
MyMethod(b) 

它甚至有可能有一個參數誰的類型是未知的,直到運行?

如果是這樣,我該怎麼做?

如果不是,如何通過以這種方式利用,而不在每一個類重複該方法的代碼,其對許多類的一些功能的方法?

編輯 - 我已經編輯了以上我的代碼做一個類的實例確實通了,不只是類名。但是我仍然得到了無效的參數消息。

+0

你說的'的ClassA實例'或'Type'實例?你不能像這個'MyMethod(ClassA)' –

+0

那樣傳遞類名,你可能想要考慮讓這兩種類型實現一個通用接口,並使其成爲'MyMethod(ISomeInterface obj)' –

回答

2

假設ClassA是一個類型名稱,那麼該語法無效;您必須通過在實例的類型的,或類型的Type

MyMethod(new ClassA()); 

MyMethod(typeof(ClassA)); 

對於後一種情況,你也可以考慮重構使用泛型:

MyMethod<ClassA>(); 

甚至有可能有一個參數誰是類型是未知的,直到ru n時間?

絕對; object會很好,但你需要給該參數一個有效的值。

+0

是不是使用'static void MyMethod(Object obj)',然後將'obj'強制轉換爲'ClassA'或'ClassB',導致巨大的LSP違規? –

+0

@IlyaIvanov沒有人對鑄造這些東西有任何表示,具體而言。一個接口可能是理想的解決方案,但它實際上取決於完整的上下文,我們並不知道。 –

+0

好的,我不反對你的回答。我只是想知道關於'obj是否是ClassA或ClassB'的假設以及方法重載如何適應這種需求。 –

0

你傳遞一個類型,而不是一個類型的實例。

考慮這個: -

var test = new ClassA(); 
MyMethod(test); 
1

你需要通過類的實例(對象)。嘗試:

MyMethod(new ClassA()); 
MyMethod(new ClassB()); 

我建議overloading的MyMethod,如:

public void MyMethod(ClassA a) { ... } 
punlic void MyMethod(ClassB b) { ... } 
+0

如何有多個重載(每個參數類型一個)比重複每個類中的方法更好?兩者似乎都包含許多重複的代碼。 – PJW

0

你應該重載MyMethod理查德的建議。

如果你仍然想使用只有一個方法的定義,你可以使用類似:

public static void UnknownArgumentsMethod2(params object[] list) 
{ 
    foreach (object o in list) 
    { 
     if (o.GetType() == typeof(int)) 
     { 
      Console.WriteLine("This is an integer: " + (int)o); 
     } 
     else if (o.GetType() == typeof(ClassA)) 
     { 
      Console.WriteLine("This is an object of ClassA"); 
     } 
    } 
} 
0

如果ClassA和ClassB的具有相同功能的簽名,可以考慮使用接口。如果實現相同,則在基本抽象類中實現它們,並根據需要在繼承的類中重寫它們。

interface IMyInterface 
{ 
    void MethodX(); 
} 

abstract class ClassBase: IMyInterface 
{ 
    public virtual void MethodX() 
    { 
     Console.WriteLine("MethodX from base class"); 
    } 
} 

// this will use base class implementation of MethodX 
class ClassA : ClassBase 
{ 
} 

class ClassB : Classbase 
{ 
    public void MethodX() 
    { 
     Console.WriteLine("MethodX from ClassB"); 
    } 
} 


class Foo 
{ 
    public void MyMethod(IMyInterface obj) 
    { 
     obj.MethodX(); 
    } 
} 



Foo f = new Foo(); 

IMyInterface ca = new ClassA(); 
f.MyMethod(ca); // This Print MethodX from ClassA, in this case BaseClass 

IMyInterface cb = new ClassB(); 
f.MyMethod(cb); // This Print MethodX from ClassB 
+0

我沒有看到界面如何在這裏幫助。由於界面不包含任何實現,我不得不在每個使用界面的課程中重複他的代碼。重複的代碼是我想要避免的。 – PJW

0

其實錯誤是在這裏 -

public static void MyMethod(Object obj) 

一旦我改變的參數如下:

public static void MyMethod(object obj) 

它工作得很好:)

+0

我剛剛遇到了這個答案。 「對象」和「對象」是一回事:'System.Object'。這兩條線完全一樣! – Andrew

相關問題