In today's section, we'll see how to extend even inaccessible class and write test against that, but before that let us assume that you have the following class:
- internal class internalClass:baseClass
- {
- public string getFirstValue()
- {
- return "extension";
- }
- internal class secondClass
- {
- internal string getSecondValue()
- {
- return "smith";
- }
- private class thirdClass
- {
- private string getThirdValue()
- {
- return "dave";
- }
- }
- }
- }
- [TestMethod]
- public void Class1Test()
- {
- var obj1 = new internalClass();
- Assert.AreEqual("extension",obj1.getFirstValue());
- }
- [TestMethod]
- public void Class2Test()
- {
- var obj2 = new internalClass.secondClass();
- Assert.AreEqual("smith", obj2.getSecondValue());
- }
- [TestMethod]
- public void Class3Test()
- {
- var type = typeof (internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- var methodInfo = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var obj3 = Activator.CreateInstance(type);
- Assert.AreEqual("dave",methodInfo.Invoke(obj3,null));
- }
- internal static class internalClassExtensions
- {
- public static string getFirstValueUpper(this internalClass objClass)
- {
- return objClass.getFirstValue().ToUpper();
- }
- }
- [TestMethod]
- public void Class1ExtensionTest()
- {
- var obj1 = new internalClass();
- Assert.AreEqual("EXTENSION", obj1.getFirstValueUpper());
- }
Similarly, we can go ahead and extend the second class as in the following code snippet:
- public static string getSecondValueUpper(this internalClass.secondClass objSecondClass)
- {
- return objSecondClass.getSecondValue().ToUpper();
- }
- [TestMethod]
- public void Class2ExtensionTest()
- {
- var obj2 = new internalClass.secondClass();
- Assert.AreEqual("SMITH", obj2.getSecondValueUpper());
- }
- //Cannot access private class as shown below
- /*public static string getThirdValueUpper(this internalClass.secondClass.thirdClass )
- {
- }*/
- //hence, if we really need to extend inaccessible class, we can extend object
- public static string getThirdValueUpper(this object obj)
- {
- var upper = string.Empty;
- var type = typeof (internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- if (obj.GetType() == type)
- {
- //Now, I gain the access of private method as welll
- var method = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var result = method.Invoke(obj, null) as string;
- upper = result.ToUpper();
- }
- return upper;
- }
- [TestMethod]
- public void Class3ExtensionTest()
- {
- var type = typeof(internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- var methodInfo = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var obj3 = Activator.CreateInstance(type);
- Assert.AreEqual("DAVE", obj3.getThirdValueUpper());
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ExtensionMethods.Classes
- {
- internal abstract class baseClass
- {
- public virtual string getFirstName()
- {
- return "rahul";
- }
- protected virtual string getSecondName()
- {
- return "sahay";
- }
- }
- internal class internalClass:baseClass
- {
- public string getFirstValue()
- {
- return "extension";
- }
- internal class secondClass:baseClass
- {
- public override string getFirstName()
- {
- return "John";
- }
- internal string getSecondValue()
- {
- return "smith";
- }
- private class thirdClass
- {
- private string getThirdValue()
- {
- return "dave";
- }
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- namespace ExtensionMethods.Classes
- {
- internal static class internalClassExtensions
- {
- public static string getBaseStringUpper(this baseClass objClass)
- {
- return objClass.getFirstName().ToUpper();
- }
- public static string getFirstValueUpper(this internalClass objClass)
- {
- return objClass.getFirstValue().ToUpper();
- }
- public static string getSecondValueUpper(this internalClass.secondClass objSecondClass)
- {
- return objSecondClass.getSecondValue().ToUpper();
- }
- //Cannot access private class as shown below
- /*public static string getThirdValueUpper(this internalClass.secondClass.thirdClass )
- {
- }*/
- //hence, if we really need to extend inaccessible class, we can extend object
- public static string getThirdValueUpper(this object obj)
- {
- var upper = string.Empty;
- var type = typeof (internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- if (obj.GetType() == type)
- {
- //Now, I gain the access of private method as welll
- var method = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var result = method.Invoke(obj, null) as string;
- upper = result.ToUpper();
- }
- return upper;
- }
- }
- }
- using System;
- using System.Reflection;
- using ExtensionMethods.Classes;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- namespace Legacy.Tests.Extension_Tests
- {
- [TestClass]
- public class InternalClassTests
- {
- [TestMethod]
- public void Class1Test()
- {
- var obj1 = new internalClass();
- Assert.AreEqual("extension",obj1.getFirstValue());
- }
- [TestMethod]
- public void Class2Test()
- {
- var obj2 = new internalClass.secondClass();
- Assert.AreEqual("smith", obj2.getSecondValue());
- }
- [TestMethod]
- public void Class3Test()
- {
- var type = typeof (internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- var methodInfo = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var obj3 = Activator.CreateInstance(type);
- Assert.AreEqual("dave",methodInfo.Invoke(obj3,null));
- }
- [TestMethod]
- public void Class1ExtensionTest()
- {
- var obj1 = new internalClass();
- Assert.AreEqual("EXTENSION", obj1.getFirstValueUpper());
- }
- [TestMethod]
- public void Class2ExtensionTest()
- {
- var obj2 = new internalClass.secondClass();
- Assert.AreEqual("SMITH", obj2.getSecondValueUpper());
- }
- [TestMethod]
- public void Class3ExtensionTest()
- {
- var type = typeof(internalClass.secondClass).GetNestedType("thirdClass", BindingFlags.NonPublic);
- var methodInfo = type.GetMethod("getThirdValue", BindingFlags.NonPublic | BindingFlags.Instance);
- var obj3 = Activator.CreateInstance(type);
- Assert.AreEqual("DAVE", obj3.getThirdValueUpper());
- }
- [TestMethod]
- public void baseClassTest()
- {
- var obj0 = new internalClass();
- Assert.AreEqual("rahul",obj0.getFirstName());
- Assert.AreEqual("RAHUL", obj0.getBaseStringUpper());
- }
- [TestMethod]
- public void Class2OverrideTest()
- {
- var obj0 = new internalClass.secondClass();
- //Below assertion will fail, as this is overriden
- /*Assert.AreEqual("rahul", obj0.getFirstName());
- Assert.AreEqual("RAHUL", obj0.getBaseStringUpper());*/
- Assert.AreEqual("John", obj0.getFirstName());
- Assert.AreEqual("JOHN", obj0.getBaseStringUpper());
- }
- }
- }

There are many other tests other than these, that's why I have not highlighted the same. Thanks for joining me.
Thanks!

Humayun Kabir MamunPosted Sep 21, 2015, 2:37 AM
Nice...
Vipul MalhotraPosted Sep 20, 2015, 6:16 AM
nice Article
Vignesh ManiPosted Sep 20, 2015, 5:44 AM
Nice One
Karthikeyan KPosted Sep 20, 2015, 1:40 AM
Good one sir...Thanks for sharing
Saineshwar BageriPosted Sep 20, 2015, 12:58 AM
nice one
Sujeet SumanPosted Sep 19, 2015, 5:01 AM
Nice Article
Nilesh JadavPosted Sep 19, 2015, 1:32 AM
Nice Article
Nilesh JadavPosted Sep 19, 2015, 1:31 AM
Good Article
Vaikesh K PPosted Sep 19, 2015, 12:37 AM
Nice
Rajeesh MenothPosted Sep 18, 2015, 1:51 PM
Good Article
Mohammed IbrahimPosted Sep 18, 2015, 1:11 PM
nice
Santhakumar MunuswamyPosted Sep 18, 2015, 10:46 AM
Good Article
Harshad PansuriyaPosted Sep 18, 2015, 8:54 AM
Nice one