У меня есть следующий код, который генерирует 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."))
было бы очень отстойным ... и неточным)