में केवल दूसरा तर्क प्रकार सेट करें मुझे निर्दिष्ट प्रकार के साथ संग्रह से फ़र्ट्स संपत्ति का चयन करने के लिए एक विधि बनाना है।जेनेरिक विधि
मैं इस तरह विधि बनाया है (मैं संक्षिप्तता के लिए कुछ भागों को हटा दिया है):
public static IQueryable<TResult> SelectFirstPropertyWithType<T, TResult>(this IQueryable<T> source)
{
// Get the first property which has the TResult type
var propertyName = typeof(T).GetProperties()
.Where(x => x.PropertyType == typeof(TResult))
.Select(x => x.Name)
.FirstOrDefault();
var parameter = Expression.Parameter(typeof(T));
var body = Expression.Convert(Expression.PropertyOrField(parameter, propertyName), typeof(TResult));
var expression = Expression.Lambda<Func<T, TResult>>(body, parameter);
return source.Select(expression);
}
और मैं के रूप में इस विधि कॉल कर सकते हैं:
List<Person> personList = new List<Person>();
// .. initialize personList
personList.AsQueryable()
.SelectFirstPropertyWithType<Person, int>()
.ToList();
सब कुछ ठीक काम करता है।
लेकिन, मैं पहले तर्क प्रकार को Person
के रूप में सेट नहीं करना चाहता, क्योंकि संकलक इस तर्क प्रकार को संग्रह के स्रोत से अनुमानित कर सकता है। वहाँ किसी भी तरह से इस तरह विधि कॉल कर सकता:
.SelectFirstPropertyWithType<int>()
समस्या मैं अपने विधि के अंदर T
पैरामीटर की आवश्यकता है, और मैं क्रम में प्रतिबिंब के साथ Func
बनाने के लिए नहीं करना चाहती।
धन्यवाद।
इस बारे में इसी तरह के कई सवाल था। जवाब बस है - आप ऐसा कुछ नहीं कर सकते हैं। कंपाइलर सभी प्रकार का अनुमान लगा सकता है या कोई भी –