C# how to get type of generic class using reflection


In the following example, given an instance of SystemFolder, how would you find the generic type 
Folder given that SystemFolder : IDropTarget<Folder>?

using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
 
namespace CSharpGenerics
{
public class GenericUtilities
    {
        // Example Type type = GenericUtilities.GetGenericType(new SystemFolder()); will return Folder
        public static Type GetGenericType(object @object)
        {
            var type = @object.GetType();
            var iDropTargetObject = type.GetInterfaces().
FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IDropTarget<>));
            Debug.Assert(iDropTargetObject != null);
            return iDropTargetObject.GetGenericArguments()[0];
        }
    }
    public class SystemFolder : IDropTarget<Folder>     {         public SystemFolder()         {             Items = new Collection<Folder>();         }         public Collection<Folder> Items { getset; }         #region IDropTarget Members         public string Name         {             get { return "My Drop Target"; }         }         public void Add(Folder item)         {             Items.Add(item);         }         #endregion IDropTarget Members     }     public class Folder     {     }     public interface IDropTarget     {         string Name { get; }         void Add(T item);     } }

Test Class
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace CSharpGenerics.Tests
{
    [TestClass]
    public class SystemFolderTest
    {
        [TestMethod]
        public void GetGenericType()
        {
            // Act
            var genericType = GenericUtilities.GetGenericType(new SystemFolder());
 
           // Assert
            Assert.AreEqual(genericType, typeof(Folder));
 
        }
    }
}

Comments

Popular posts from this blog

WPF How to Dispose ViewModel when the associated UserControl (Not Window) closes?

C# How to unit test Dispatcher

WPF: How to Deep Copy WPF object (e.g. UIElement) ?