以下代码按对象中存在的任何属性名称(作为字符串)对任何对象数组进行排序。
使用排序方向“asc”或“desc”完成排序数组。
这是我想要应用的目标。
using System.Linq.Dynamic;
/// <summary>
/// This method sorts any array of objects.
/// </summary>
/// <param name="dataSource">Array of objects</param>
/// <param name="propertyName">property name to sort with</param>
/// <param name="sortDirection">"ASC" or "DESC"</param>
/// <returns></returns>
private object[] SortArrayOfObjects(object[] dataSource, string propertyName, string sortDirection)
{
string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
// sortExpression will be something like "FirstName DESC".
// OrderBy method takes expression as string like "FirstName DESC".
// OrderBy method exists in "System.Linq.Dynamic" dll.
// Download it from www.nuget.org/packages/System.Linq.Dynamic/
object[] arrSortedObjects = dataSource.OrderBy(sortExpression).ToArray();
return arrSortedObjects;
}
答案 0 :(得分:1)
你可以通过使方法通用来接受调用方法中的类型,然后使用类型参数T将dataSource转换为。来实现你想要的。
private object[] SortArrayOfObjects<T>(object[] dataSource, string propertyName, string sortDirection)
{
string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
// sortExpression will be something like "FirstName DESC".
// OrderBy method takes expression as string like "FirstName DESC".
// OrderBy method exists in "System.Linq.Dynamic" dll.
// Download it from www.nuget.org/packages/System.Linq.Dynamic/
object[] arrSortedObjects = dataSource.Cast<T>().OrderBy(sortExpression).Cast<object>().ToArray();
return arrSortedObjects;
}
}
// Use it like: | You pass the type, so no need for hardcoding it, and it should work for all types.
SortArrayOfObjects<EmployeeInfo>(object[] dataSource, string propertyName, string sortDirection);
这是一个完整的演示:
将它放在DLL输出的项目中: 使用系统; 使用System.Collections.Generic; 使用System.Text; 使用System.Collections.Generic; 使用System.Linq; 使用System.Linq.Dynamic;
namespace GenericMethod
{
public class GenericMethodClass
{
public T[] SortArrayOfObjects<T>(object[] dataSource, string propertyName, string sortDirection)
{
string sortExpression = string.Format("{0} {1}", propertyName, sortDirection);
// sortExpression will be something like "FirstName DESC".
// OrderBy method takes expression as string like "FirstName DESC".
// OrderBy method exists in "System.Linq.Dynamic" dll.
// Download it from www.nuget.org/packages/System.Linq.Dynamic/
T[] arrSortedObjects = dataSource.Cast<T>().OrderBy(sortExpression).ToArray();
return arrSortedObjects;
}
}
}
将它放在控制台应用程序项目中,并确保引用包含上述代码的库: 使用系统; 使用System.Collections.Generic; 使用System.Text; 使用GenericMethod; 使用System.Linq;
namespace GenericMethodApp
{
public class Program
{
static void Main(string[] args)
{
var employees = new object[]
{
new EmployeeInfo { FirstName = "Mohammed" },
new EmployeeInfo { FirstName = "Ghasan" }
};
var students = new object[]
{
new Student { StudentName = "Mike" },
new Student { StudentName = "Harris" }
};
var genericMethodClass = new GenericMethodClass();
// Note that the generic method returns the array of the specific type
// thanks to the T type parameter.
EmployeeInfo[] returnedEmployees = genericMethodClass.SortArrayOfObjects<EmployeeInfo>(employees, "FirstName", "ASC");
Student[] returnedStudents = genericMethodClass.SortArrayOfObjects<Student>(students, "StudentName", "ASC");
foreach (var employee in returnedEmployees)
Console.WriteLine(employee.FirstName);
Console.WriteLine();
foreach (var Student in returnedStudents)
Console.WriteLine(Student.StudentName);
Console.ReadKey();
}
}
public class EmployeeInfo
{
public string FirstName { get; set; }
}
public class Student
{
public string StudentName { get; set; }
}
}
你已经完成了。
确保在DLL中引用System.Linq.Dynamic。