回答
如果你知道實際的類型,然後只是:
SomeType typed = (SomeType)obj;
typed.MyFunction();
如果你不知道實際的類型,那麼:不是真的,沒有。你將不得不改用之一:
- 反射
- 實現一個衆所周知的接口
- 動態
例如:
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
鑄造實際類型很容易:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
這很有趣... – Steve
這是不合邏輯的。你實際上不知道實際的類型。你應該怎麼做? –
我不認爲你可以(不是沒有反思),你應該爲你的功能提供一個類型:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD:
這可能會爲你工作:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
這真的是一個無用的答案,不配得票。按照OP的要求,反射類型對象的對象不會產生對象的「實際類型」。另外,你的MyMethod邏輯是有缺陷的,因爲obj可以是A類型的,也可以是B類型的。你的邏輯沒有提供「實際類型」(如OP所要求的) - 它提供了兼容類型,並不一定在那個期望的類型。 – Jazimov
Implement an interface to call your function in your method
interface IMyInterface
{
void MyinterfaceMethod();
}
IMyInterface MyObj = obj as IMyInterface;
if (MyObj != null)
{
MyMethod(IMyInterface MyObj);
}
如果您MyFunction()
方法在一個類(及其後代)僅定義,嘗試
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
如果你有不相關的類大量定義要調用的函數,你應該定義一個接口,使您的類定義界面:
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
它轉換爲它的真正的類型,如果你現在例如型呢面向名爲abc的類。 你可以調用你的函數以這種方式:
(abc)(obj)).MyFunction();
,如果你不知道它可以以不同的方式來實現該功能。總是不容易。但是你可以通過它的簽名以某種方式找到它。如果這是你的情況,你應該讓我們知道。
在我的情況下,AutoMapper運行良好。
AutoMapper可以映射到/從動態對象沒有任何明確的配置:
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
同樣可以從字典直接映射爲對象,AutoMapper將排隊與屬性名稱的鍵。
更多信息https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
- 1. Cast boost ::將任何實例轉換爲其實際類型
- 2. 將[object,Object],[object,Object]的JSON數組轉換爲實際值?
- 3. 如何將String []或Object []的組件轉換爲其他類型
- 4. 如何將TypeCode轉換爲實際類型?
- 5. 如何將ctypes c_void_p對象轉換爲實際類型?
- 6. 如何將類型Object從engine.eval轉換爲類型int
- 7. 將類型'object'轉換爲'System.Data.SqlClient.SqlCommand錯誤
- 8. 如何將char轉換爲實際值?
- 9. 如何將「[object Object]」轉換爲數字
- 10. 如何「動態」將Object類型的實例轉換爲其特定的數據類型?
- 11. 如何在javascript中將[object Object],[object Object]轉換爲[Object,Object]?
- 12. 如何將html編碼符號轉換爲其實際字符?
- 13. 將IEnumerable(Of Object)轉換爲實現IEnumerable(Of Object)的類?
- 14. 將字節轉換爲實際字節類型的字符串
- 15. 無法將類型'[String:Any Object]'轉換爲預期類型'String'
- 16. 將java遺留代碼轉換爲泛型 - 如何用類型替換Object?
- 17. Swift:將實際類型數組轉換爲協議類型數組
- 18. 如何將一個通過反射實例化的對象轉換爲其實際類型?
- 19. 實例化內部類並將其轉換爲給定類型
- 20. 將對象轉換爲其他類型
- 21. 將mmapped ByteString轉換爲其他類型?
- 22. 如何將子類的實例轉換爲其超類?
- 23. 轉換CookComputing XMLRpcStruct(IEnumerable的<Object>)和實際的C#類
- 24. 如何將對象實例轉換爲泛型類型?
- 25. 如何從日期轉換爲實際
- 26. 將實體轉換爲FormCollection類型
- 27. 將IDictionary <string,object>轉換爲類
- 28. 如何將Javascript Map轉換爲Object?
- 29. 如何將Object []類型轉換爲用戶自定義的陣列型
- 30. 將html-json轉換爲實際的json
該類型在編譯時是否已知? – psubsee2003
你期望從這方面完成什麼?請告訴我們你想達到的目標,而不是你期望達到的目標。 –
@JonSkeet:我希望能夠從對象中調用一個函數。目前'obj.MyFunction();'不能編譯,即使我知道真實的對象確實有這個功能。 –