2014-04-02 55 views
1

說,我有一個對象,這是A類:如何/我可以使用另一個對象上存在的方法動態擴展c#對象?

abstract class A { 
    public abstract SomeType SomeMethod(int i) 
    public abstract SomeType SomeOtherMethod() 
} 

我可以/我如何創建一個對象B,B類 - 其中,在運行時,可以採取任何對象(比如A),並將其包裝:

class B { 
    public void Wrap(object someObject) {} 
} 

,這樣我可以寫代碼如下:

var a = Factory.BuildAn<A>(); 
var b = new B(); 
b.Wrap(a); 
b.SomeMethod(1); 
+0

你可以但我恐怕它是不值得的。看到這個:[Emitting Dynamic Methods and Assemblies](http://msdn.microsoft.com/en-us/library/8ffc3x75(v = vs.110).aspx) –

+1

你不能在非抽象類'A中定義抽象方法'。另外,抽象方法不能有正文。 –

+0

@Selman22哦,我的。那。它真的聽起來像我不想這樣做在C# – blueberryfields

回答

2

是,你可以在C#中使用動態類型。 B類將看起來像這樣,你會在你的問題中使用它。

class B : DynamicObject 
{ 
    object _object; 
    public void Wrap(object someObject) 
    { 
     _object = someObject; 
    } 

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     try 
     { 
      result = _object.GetType().InvokeMember(
       binder.Name, 
       BindingFlags.InvokeMethod | 
       BindingFlags.Public | 
       BindingFlags.Instance, 
       null, _object, args); 
       return true; 
     } 
     catch 
     { 
      result = null; 
      return false; 
     } 
    } 
} 
3

我不知道你想什麼問題,這個解決,但在這裏就是你問什麼。

class MyClass 
{ 
    public int IntValue { get; set; } 

    public string SomeMethod(int i) 
    { 
     return i.ToString(); 
    } 
    public string SomeOtherMethod() 
    { 
     return "Hello"; 
    } 
} 

class Wrapper : DynamicObject 
{ 
    private object wrappedObject; 

    public Wrapper(object wrappedObject) 
    { 
     this.wrappedObject = wrappedObject; 
    } 

    private void Wrap(object someObject) 
    { 
     wrappedObject = someObject; 
    } 


    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     PropertyInfo prop = wrappedObject.GetType() 
      .GetProperty(binder.Name, BindingFlags.Instance | BindingFlags.Public); 
     if (prop == null) 
     { 
      result = null; 
      return false; 
     } 

     result = prop.GetValue(wrappedObject, null); 
     return true; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     PropertyInfo prop = wrappedObject.GetType() 
      .GetProperty(binder.Name, BindingFlags.Instance | BindingFlags.Public); 
     if (prop == null) 
     { 
      return false; 
     } 

     prop.SetValue(wrappedObject, value); 
     return true; 
    } 

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     MethodInfo method = wrappedObject.GetType() 
      .GetMethod(binder.Name, BindingFlags.Instance | BindingFlags.Public); 
     if (method == null) 
     { 
      result = null; 
      return false; 
     } 

     result = method.Invoke(wrappedObject, args); 
     return true; 
    } 
} 

MyClass a = new MyClass(); 
dynamic d = new Wrapper(a); 
d.IntValue = 5; 
string s = d.SomeOtherMethod(); 
Console.WriteLine(a.IntValue); 
相關問題