ถ้าฉันมี:
void MyMethod(Object obj) {   ...   }
ฉันobjจะแคสให้เป็นประเภทที่แท้จริงได้อย่างไร?
obj.MyFunction();ไม่ได้รวบรวมแม้ว่าฉันจะรู้ว่าวัตถุจริงมีฟังก์ชันนั้น
                MyFunctionวิธีการ?
                ถ้าฉันมี:
void MyMethod(Object obj) {   ...   }
ฉันobjจะแคสให้เป็นประเภทที่แท้จริงได้อย่างไร?
obj.MyFunction();ไม่ได้รวบรวมแม้ว่าฉันจะรู้ว่าวัตถุจริงมีฟังก์ชันนั้น
                MyFunctionวิธีการ?
                คำตอบ:
หากคุณทราบประเภทที่แท้จริงให้ทำดังนี้
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();
              asสำหรับการพิมพ์และtype(of: ClassName)ฟังก์ชั่นในการตรวจสอบประเภทอินสแตนซ์
                    ฉันไม่คิดว่าคุณทำได้ (ไม่ใช่โดยไม่ไตร่ตรอง) คุณควรระบุประเภทให้กับฟังก์ชันของคุณด้วย:
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;
        ...
    }
}
              วิธีการเกี่ยวกับ JsonConvert.DeserializeObject (object ToString ());
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
                    ในกรณีของฉัน 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
วิธีนี้อาจไม่ได้ผลดีที่สุด แต่ทำได้ง่ายและได้ผล
ดำเนินการสองอย่าง: ประการแรกเรียกว่า. ToString () ซึ่งเป็นพื้นฐานของการทำให้เป็นอนุกรมจากนั้นจึงทำการแยกสารโดยใช้ Newtonsoft nuget (ซึ่งคุณต้องติดตั้ง)
public T Format<T>(Object obj) =>
    JsonConvert.DeserializeObject<T>(obj.ToString());
              ถ้า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();
หากคุณไม่ทราบฟังก์ชันสามารถทำได้ด้วยวิธีอื่น ไม่ใช่เรื่องง่ายเสมอไป แต่คุณสามารถหาได้จากลายเซ็นของมัน หากเป็นกรณีของคุณคุณควรแจ้งให้เราทราบ
การแคสต์เป็นประเภทจริงทำได้ง่าย:
void MyMethod(Object obj) {
    ActualType actualyType = (ActualType)obj;
}
              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 );
}