Мне нужно настроить дату и время связки объектов.
Я хотел бы пропустить свойства этого класса, и если тип dateTime настроен соответствующим образом.
Есть ли какой-либо тип описания типа, который я могу использовать?
Мне нужно настроить дату и время связки объектов.
Я хотел бы пропустить свойства этого класса, и если тип dateTime настроен соответствующим образом.
Есть ли какой-либо тип описания типа, который я могу использовать?
Вы можете использовать отражение для этого.
Ваш сценарий может выглядеть примерно так:
static void Main(string[] args)
{
var list = new List<Mammal>();
list.Add(new Person { Name = "Filip", DOB = DateTime.Now });
list.Add(new Person { Name = "Peter", DOB = DateTime.Now });
list.Add(new Person { Name = "Goran", DOB = DateTime.Now });
list.Add(new Person { Name = "Markus", DOB = DateTime.Now });
list.Add(new Dog { Name = "Sparky", Breed = "Unknown" });
list.Add(new Dog { Name = "Little Kid", Breed = "Unknown" });
list.Add(new Dog { Name = "Zorro", Breed = "Unknown" });
foreach (var item in list)
Console.WriteLine(item.Speek());
list = ReCalculateDOB(list);
foreach (var item in list)
Console.WriteLine(item.Speek());
}
Если вы хотите пересчитать дни рождения всех млекопитающих. И реализация вышеизложенного выглядит следующим образом:
internal interface Mammal
{
string Speek();
}
internal class Person : Mammal
{
public string Name { get; set; }
public DateTime DOB { get; set; }
public string Speek()
{
return "My DOB is: " + DOB.ToString() ;
}
}
internal class Dog : Mammal
{
public string Name { get; set; }
public string Breed { get; set; }
public string Speek()
{
return "Woff!";
}
}
В основном, вам нужно использовать Relfection, который является механизмом для проверки типов и получения свойств типов и других подобных вещей во время выполнения. Вот пример того, как вы добавляете 10 дней к вышеуказанному DOB для каждого млекопитающего, получившего DOB.
static List<Mammal> ReCalculateDOB(List<Mammal> list)
{
foreach (var item in list)
{
var properties = item.GetType().GetProperties();
foreach (var property in properties)
{
if (property.PropertyType == typeof(DateTime))
property.SetValue(item, ((DateTime)property.GetValue(item, null)).AddDays(10), null);
}
}
return list;
}
Просто помните, что использование отражения может быть медленным, и оно медленное вообще.
Однако выше выведет это сообщение:
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
Woff!
Woff!
Woff!
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
Woff!
Woff!
Woff!
Он называется Reflection.
var t = this;
var props = t.GetType().GetProperties();
foreach (var prop in props)
{
if (prop.PropertyType == typeof(DateTime))
{
//do stuff like prop.SetValue(t, DateTime.Now, null);
}
}
class HasDateTimes
{
public DateTime Foo { get; set; }
public string NotWanted { get; set; }
public DateTime Bar { get { return DateTime.MinValue; } }
}
static void Main(string[] args)
{
foreach (var propertyInfo in
from p in typeof(HasDateTimes).GetProperties()
where Equals(p.PropertyType, typeof(DateTime)) select p)
{
Console.WriteLine(propertyInfo.Name);
}
}
искать отражение, но в основном вы это делаете
obj.GetType(). GetProperties (.. Instance |..Public), и вы получили список определенных свойств. Проверьте тип значения свойства и сравните его с типомof (DateTime).
Для очень быстрых ответов и указаний на этот вопрос, и если у вас есть PowerShell (Vista/Windows 7, Windows 2008 уже установлена), вы можете просто запустить консоль и для DateTime, например. сделать
Get-Date | Get-Member
Будет отображаться список экземпляров DateTime. Вы также можете посмотреть на статические элементы:
Get-Date | Get-Member -Static
Если вас беспокоит влияние отражения производительности, вы можете быть заинтересованы в Fasterflect, библиотеке, которая будет запрашивать и получать доступ к элементам проще и быстрее.
Для instax код MaxGuernseyIII может быть переписан с использованием Fasterflect следующим образом:
var query = from property in typeof(HasDateTimes).Properties()
where property.Type() == typeof(DateTime)
select p;
Array.ForEach( query.ToArray(), p => Console.WriteLine( p.Name ) );
Fasterflect использует генерацию легкого кода для ускорения доступа (в 2-5 раз или с близкими к скорости, если вы кешируете и вызываете созданные делегаты напрямую). Запрос для членов обычно проще и удобнее, но не быстрее. Обратите внимание, что эти числа не содержат значительных начальных издержек JIT-компиляции сгенерированного кода, поэтому рост производительности становится видимым только для повторного доступа.
Отказ от ответственности: я участвую в проекте.
Эй, этот вопрос немного старше, но вы можете использовать это:
внутри класса (выбирая все значения) - значения настройки будут выполняться без приведения, которое оно выбрало только для выбора:
(from property in this.GetType().GetProperties()
where property.PropertyType == typeof(DateTime)
select property.GetValue(this)).Cast<DateTime>()
вне класса будет:
var instance = new MyClass();
var times = (from property in instance.GetType().GetProperties()
where property.PropertyType == typeof(DateTime)
select property.GetValue(instance)).Cast<DateTime>()
Для получения значения max Datetime я запускаю этот
var lastChange = (from property in this.GetType().GetProperties()
where property.PropertyType == typeof(DateTime)
select property.GetValue(this)).Cast<DateTime>().Max();