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 { get; set; }
#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
Post a Comment