[過去ログ]
ふらっと C#,C♯,C#(初心者用) Part141 (1002レス)
ふらっと C#,C♯,C#(初心者用) Part141 http://mevius.5ch.net/test/read.cgi/tech/1544838367/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
575: デフォルトの名無しさん [sage] 2020/06/21(日) 20:17:32 ID:aN4OBWpj 派生クラスのインスタンスが与えられていて、abstruct な基底クラスの virtual なメソッドを呼び出すにはどうすればいいでしょうか? using System; using System.Reflection; namespace ConsoleApp1 { class Base1 { public virtual void method1() { Console.WriteLine("Base1 method1"); } } abstract class D1 : Base1 { public override void method1() { Console.WriteLine("D1 method1"); } } http://mevius.5ch.net/test/read.cgi/tech/1544838367/575
576: デフォルトの名無しさん [sage] 2020/06/21(日) 20:17:46 ID:aN4OBWpj class D2 : D1 { public override void method1() { Console.WriteLine("D2 method1"); } public void callBaseMethod() { base.method1(); } } class Program { static void Main(string[] args) { D2 d2instance = new D2(); d2instance.method1(); d2instance.callBaseMethod(); Type d1type1 = d2instance.GetType().BaseType; MethodInfo mi1 = d1type1.GetMethod("method1", BindingFlags.Instance | BindingFlags.Public); mi1.Invoke(d2instance, null); D1 d2asD1 = d2instance as D1; MethodInfo mi2 = d1type1.GetMethod("method1", BindingFlags.Instance | BindingFlags.Public); mi2.Invoke(d2instance, null); } } } http://mevius.5ch.net/test/read.cgi/tech/1544838367/576
577: デフォルトの名無しさん [sage] 2020/06/21(日) 20:20:09 ID:aN4OBWpj D2クラスのメソッド内からは base を使って D1::method1 を呼び出せますが、D2クラス外から D1::method1 を呼び出したいのです。 reflection を例のように試してみましたが、これではD2.method1 が実行されました。 http://mevius.5ch.net/test/read.cgi/tech/1544838367/577
580: デフォルトの名無しさん [sage] 2020/06/21(日) 22:28:34 ID:aN4OBWpj static void Main(string[] args) { D2 d2instance = new D2(); D1 d2asD1 = d2instance as D1; MethodInfo mi5 = typeof(D1).GetMethod("method1", BindingFlags.Instance | BindingFlags.Public); var dynamicMethod = new DynamicMethod("baseMethod1", mi5.ReturnType, new[] { mi5.DeclaringType }, mi5.DeclaringType); var il = dynamicMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.EmitCall(OpCodes.Call, mi5, null); il.Emit(OpCodes.Ret); dynamicMethod.Invoke(null, new object[] { d2asD1 }); } これで D1 method1 と出力されました。 何で出来るのかはさっぱり分からないけど、完全に理解したので、感謝の気持ちだけ送ります。 http://mevius.5ch.net/test/read.cgi/tech/1544838367/580
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.532s*