mardi 23 décembre 2014

Get name of a property and declaring class

How can I use reflection to get the name and declaring class of a property of a generic type.


How can I use reflection to get the name and declaring class of a property of a generic type.


The purpose is to get an exception if I read a property where nothing has been written so far.


One of the problems is that the check must be independent of the declaring class.


value.GetType().DeclaringType is always null.



using System;

namespace TestCodeContract
{

public struct CheckForNull<T> where T : struct
{
private T? backingField;

public static implicit operator T(CheckForNull<T> value)
{
if (!(value.backingField.HasValue))
{
var t1 = value.GetType().DeclaringType; // always null.

var propertyName = "Delta"; // TODO get from Reflection
var className = "ContractClass"; // TODO get from Reflection
var msg = String.Format("Proprety '{0}' in class '{1}' is not initialized", propertyName, className);
throw new ApplicationException(msg);
}
return value.backingField.Value;
}

public static implicit operator CheckForNull<T>(T value)
{
return new CheckForNull<T> { backingField = value };
}
}

public class ContractClass
{
public CheckForNull<int> Delta { get; set; }

public void Test1()
{
int x = Delta; // Wanted: "Property 'Delta' in class 'ContractClass' is not initialized"
}
}
}





Aucun commentaire:

Enregistrer un commentaire