Знать, являются ли поля / свойства объекта «простыми / примитивными» типами или другими объектами?

У меня есть следующий код, который генерирует DLL (пример примера):

public class PluginClass
{
    private string _MyString;
    public string MyString
    {
        get { return _MyString; }
        set
        {
            _MyString = value;
            RaisePropertyChanged("MyString");
        }
    }

    public int MyInt;

    public SpeedGenerator SpeedGenerator1 = new SpeedGenerator();

    public GaugeValueGenerator GaugeValueGenerator1
    {
        get;
        set;
    }

    public PluginClass()
    {
        GaugeValueGenerator1 = new GaugeValueGenerator();
    }
}

Как видите, у меня 4 поля / свойства.

1 примитивное поле (примитив - это int / string / bool / etcetc ...): MyInt 1 примитивное свойство: MyString 1 поле объекта: SpeedGenerator1 1 свойство объекта: GaugeValueGenerator1

Когда я анализировал мою DLL, мне нужно было выполнить код, который находится в функции: WriteProperty

var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);
var props = type.GetProperties();

foreach (FieldInfo field in fields)
{
    WriteProperty(field.FieldType, field.Name, XXX);
}

foreach (PropertyInfo prop in props)
{
    WriteProperty(prop.PropertyType, prop.Name, XXX);
}

Мой вопрос касается XXX, который является логическим значением, указывающим, является ли мое поле / свойство «примитивным». Таким образом, он должен быть установлен в false, если это объект. Я упал, как будто все перепробовал, но не могу решить ... Любая помощь будет очень признательна!

(Моя идея заключалась в том, чтобы вызвать

var props = propertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

и считать, что он должен быть пустым для простых / примитивных типов! Но нет ... например, для String, это возвращает свойства Chars (char []) и Length (int) ...)

(nb: Конечно, я не хочу выполнять строковую операцию с field / property.Name / FullName ... что-то вроде

if ((propertyType.FullName).Contains("System."))

было бы очень отстойным ... и неточным)

7
задан Guillaume Slashy 19 December 2011 в 15:05
поделиться