To jest mój pierwszy post i chociaż w pewnym stopniu szukałem tematów związanych z moim problemem, mam wiele problemów ze znalezieniem właściwej odpowiedzi.Utwórz nowy obiekt PropertyInfo w locie
Moje pytanie może być bardzo proste, ale zdaję sobie sprawę, że odpowiedź może nie być tak łatwa do podania. Jeśli w ogóle istnieje.
Z tym mówi, to jest moja sprawa: jako przykład, mam tablicę obiektów PropertyInfo, które używam, aby uzyskać właściwości z klasy, jak to:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
Wygląda łatwe , dobrze? Teraz mój problem jest następujący: jak utworzyć obiekt PropertyInfo i dodać go do tablicy?
Widziałem inne posty, w których użytkownicy chcą ustawić wartość VALUE PropertyInfo, ale to nie jest to, czego potrzebuję. Potrzebuję stworzyć nowy obiekt PropertyInfo, w którym jedynymi dostępnymi danymi są: i Type.
Opublikowany wcześniej test to tylko mały przykład tego, co próbuję osiągnąć. Mój prawdziwy i ostateczny cel jest w rzeczywistości, aby móc utworzyć nowy PropertyInfo na podstawie tej klasy:
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
Mam nadzieję, że ktoś może mi pomóc w osiągnięciu tego celu. Z góry bardzo dziękuję!
EDYCJA: Zapomniałem dodać o.GetType() przed metodą GetProperties(). Dzięki, Ilya Ivanov!
Wołam do SelectProperties metody tak:
list = _queriable.Select(SelectProperties).ToList();
metoda wygląda następująco:
private Expression<Func<T, List<string>>> SelectProperties
{
get
{
return value => _properties.Select
(
prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
).ToList();
}
}
pozdrowieniami,
Luis
UPDATE:
OK, więc śledzę rady 280Z28 i dziedziczę PropertyInfo w nowej klasie. Zrobiłem więcej badań i znalazłem w MSDN, że muszę zastąpić następujące metody: GetValue, SetValue, GetAccessors, GetGetMethod, GetSetMethod i GetIndexParameters.
Jednak gdy próbuję wywołać bazę z parametrami, daje mi to błąd i cytuję "Nie można wywołać abstrakcyjnego elementu:" System.Reflection.PropertyInfo.GetAccessesors (bool) "". Jeśli spróbuję wywołać metodę bez żadnych parametrów, nie pojawi się żaden błąd, ale mam wrażenie, że to niewłaściwe podejście.
To, co mam do tej pory:
public override MethodInfo[] GetAccessors(bool nonPublic)
{
MethodInfo[] temp = base.GetAccessors(nonPublic);
return temp;
}
UPDATE 2:
OK, to nie działa dobrze. Po kilku godzinach prób uzyskania klasy pochodnej albo PropertyInfo albo PropertyDescriptor, zdecydowałem się nie stosować tego podejścia.
Zamiast tego miałem inny pomysł na czytanie innych postów. Mój prawdziwy problem polega na tym, że klasa, którą zwykle czytam i używam, aby uzyskać właściwości, nie zawsze jest taka sama. Tak więc zdałem sobie sprawę, czego naprawdę potrzebuję, to po prostu sposób na stworzenie w locie dynamicznej klasy , a tylko , a następnie uzyskać właściwości.
Przeczytałem, że jest coś takiego o nazwie ExpandoObject i ElasticObject, chociaż jeszcze nie wiem, jak zastosować je do mojego problemu, aby ostatecznie uzyskać rozwiązanie.
Ok teraz, co ja naprawdę robię to jest -> I zostały z wykorzystaniem roztworu wzmiankowanym w poniższym linku: jQuery DataTables Plugin Meets C#.
Chodzi o to, to zakłada się, że mają różne modele statyczne/zajęcia dla każdego DB stół. Jednak w moim przypadku będę miał dwa rodzaje kolumn: te dostarczone przez każdą klasę tabeli DB (również podstawowe kolumny), a następnie dodatkowe kolumny, które dynamicznie dostarczam już w mojej adaptacji.
Na przykład: jeśli ta klasa tabela DB:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
I wtedy dostarczyć dodatkową kolumnę o nazwie „Akcja” typu ciąg, następnie w klasie DataTableParser w _properties attribure nie powinien być następujące informacje:
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
I szczerze mówiąc, że jest ALL muszę! Nic dodać nic ująć! Resztę już parsuję!
W końcu, ponieważ mam inną liczbę kolumn (w zestawie) niż obiekt przekazany do klasy DataTableParser, zawsze daje błąd podczas sortowania i filtrowania DataTable.
Proszę o pomoc? Naprawdę tego potrzebuję! Dzięki jeszcze raz.
poważaniem,
Luis
zwykle przechodzi się przez 'aType.GetProperties'. –
'typeof (o)' to się nie skompiluje. Prawdopodobnie masz na myśli 'o.GetType(). GetProperties()' –
Jak zamierzasz używać tego obiektu (obiektów), który próbujesz utworzyć? – Andrei