इस उत्तर का पहला भाग गलत है, मैं केवल इसे छोड़ रहा हूं ताकि टिप्पणियों में विकास समझ में आता है। कृपया EDIT देखें।
आप प्रतिबिंब की तलाश नहीं कर रहे हैं, लेकिन उत्सर्जन (जो कि दूसरी तरफ है)।
विशेष रूप से, एक विधि है जो आप चाहते हैं, भाग्यशाली आप!
देखें TypeBuilder.DefineMethodOverride
संपादित करें:
इस उत्तर लेखन, मैं सिर्फ याद आया कि re-mix आप ऐसा भी कर सकते हैं। यद्यपि यह कठिन है हालांकि।
पुन: मिश्रण एक ढांचा है जो सी # में मिश्रित "अनुकरण" करता है। अपने मूल पहलू में, आप इसके बारे में डिफ़ॉल्ट कार्यान्वयन के साथ इंटरफेस के रूप में सोच सकते हैं। यदि आप आगे जाते हैं, तो यह उससे कहीं अधिक हो जाता है।
संपादित करें 2: यहां पुन: मिश्रण के लिए उपयोग का एक उदाहरण है (एक वर्ग पर INotifyProperty को लागू करना जो इसका समर्थन नहीं करता है, और मिश्रणों का कोई विचार नहीं है)।
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Remotion.Mixins;
using System.ComponentModel;
using MixinTest;
[assembly: Mix(typeof(INPCTester), typeof(INotifyPropertyChangedMixin))]
namespace MixinTest
{
//[Remotion.Mixins.CompleteInterface(typeof(INPCTester))]
public interface ICustomINPC : INotifyPropertyChanged
{
void RaisePropertyChanged(string prop);
}
//[Extends(typeof(INPCTester))]
public class INotifyPropertyChangedMixin : Mixin<object>, ICustomINPC
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
}
public class ImplementsINPCAttribute : UsesAttribute
{
public ImplementsINPCAttribute()
: base(typeof(INotifyPropertyChangedMixin))
{
}
}
//[ImplementsINPC]
public class INPCTester
{
private string m_Name;
public string Name
{
get { return m_Name; }
set
{
if (m_Name != value)
{
m_Name = value;
((ICustomINPC)this).RaisePropertyChanged("Name");
}
}
}
}
public class INPCTestWithoutMixin : ICustomINPC
{
private string m_Name;
public string Name
{
get { return m_Name; }
set
{
if (m_Name != value)
{
m_Name = value;
this.RaisePropertyChanged("Name");
}
}
}
public void RaisePropertyChanged(string prop)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
और परीक्षण:
static void INPCImplementation()
{
Console.WriteLine("INPC implementation and usage");
var inpc = ObjectFactory.Create<INPCTester>(ParamList.Empty);
Console.WriteLine("The resulting object is castable as INPC: " + (inpc is INotifyPropertyChanged));
((INotifyPropertyChanged)inpc).PropertyChanged += inpc_PropertyChanged;
inpc.Name = "New name!";
((INotifyPropertyChanged)inpc).PropertyChanged -= inpc_PropertyChanged;
Console.WriteLine();
}
static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Console.WriteLine("Hello, world! Property's name: " + e.PropertyName);
}
//OUTPUT:
//INPC implementation and usage
//The resulting object is castable as INPC: True
//Hello, world! Property's name: Name
कृपया ध्यान दें कि:
[assembly: Mix(typeof(INPCTester), typeof(INotifyPropertyChangedMixin))]
और
[Extends(typeof(INPCTester))] //commented out in my example
और
सटीक वही प्रभाव डालें। यह एक बात है कि आप कहां परिभाषित करना चाहते हैं कि किसी विशेष वर्ग पर एक विशेष मिश्रण लागू होता है।
उदाहरण 2: अधिभावी बराबर और GetHashCode
public class EquatableByValuesMixin<[BindToTargetType]T> : Mixin<T>, IEquatable<T> where T : class
{
private static readonly FieldInfo[] m_TargetFields = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
bool IEquatable<T>.Equals(T other)
{
if (other == null)
return false;
if (Target.GetType() != other.GetType())
return false;
for (int i = 0; i < m_TargetFields.Length; i++)
{
object thisFieldValue = m_TargetFields[i].GetValue(Target);
object otherFieldValue = m_TargetFields[i].GetValue(other);
if (!Equals(thisFieldValue, otherFieldValue))
return false;
}
return true;
}
[OverrideTarget]
public new bool Equals(object other)
{
return ((IEquatable<T>)this).Equals(other as T);
}
[OverrideTarget]
public new int GetHashCode()
{
int i = 0;
foreach (FieldInfo f in m_TargetFields)
i ^= f.GetValue(Target).GetHashCode();
return i;
}
}
public class EquatableByValuesAttribute : UsesAttribute
{
public EquatableByValuesAttribute()
: base(typeof(EquatableByValuesMixin<>))
{
}
}
उदाहरण हाथ प्रयोगशाला फिर से मिश्रण के साथ दिया की मेरी कार्यान्वयन है यही कारण है कि। आप वहां अधिक जानकारी पा सकते हैं।
नहीं है, सी # बंदर समझौता नहीं किया जा सकता, कि अगर सवाल यह है कि ... –
@MarcGravell उत्सर्जन कि सक्षम बनाता है। इसके अलावा, पुनः मिश्रण भी कर सकते हैं। सी # पूरी तरह से बंदर-पैच हो सकता है! –
@ बाबून ने आपके उत्तर –