T
'un bir nesne olduğu IEnumerable<T>
olduğu düşünüldüğünde, çalışma adlarından birinin adını bir dize olarak bildiğim için, belirli bir özelliği nasıl seçebilirim? ÖrneğinÇalışma zamanında IEnumerable <T>'da dinamik bir Select'i nasıl oluşturabilirim?
:
var externalIEnumerable = DataPassedFromConsumingCode(); // `IEnumerable<T>`
string knownPropertyName = "Foo";
var fooSelect = externalIEnumerable.Select(...);
Özünde, Açıkçası sadece externalIEnumerable.Select(x=> x.Foo);
yapıyorum, ama başlangıçta oluşturulduğu zaman üzerinde kontrol sahibi olmadığı zamanlarda ben zamanında bu Select
gerçekleştirmek gerekir.
-
YANIT: Alant cevabı dayanarak, burada ben aslında bunu yaptık: Compile
arayarak IQueryable numaralandırılmış edilmesine neden çünkü
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
Ben, Bir İfadesi Olarak tuttu hangi veritabanı gereksiz yere vurulduğu anlamına geliyordu. Yani, kullanmak, sadece aşağıdakileri yapın:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
IEnumerable'da T'yi kısıtlayabilir misiniz? – Jason
Bu linux'a özgü bir soru değil, değil mi? Bir özelliğe, kod içinde statik olarak değil, adlara dinamik olarak nasıl erişileceğini mi soruyorsunuz? –
Açıklamak gerekirse, sizin T'niz bir şey olabilir, mülkünüz herhangi bir şey olabilir, sadece bir ip olarak mülk ismini alacaksınız? –