问题
The following code, sorts any array of objects by any property name (as string) exists in the object.
Sorting array is done using sorting direction "asc" or "desc" too.
This is the goal I want to apply.
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;
}
回答1:
You can do what you want by making the method generic to accept a type from the calling method, and then using type parameter T to cast the dataSource to.
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);
Here is a complete demonstration:
Put this in a project of DLL output: using System; using System.Collections.Generic; using System.Text; using System.Collections.Generic; using System.Linq; using 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;
}
}
}
Put this in a console app project and make sure to reference the library containing the code above: using System; using System.Collections.Generic; using System.Text; using GenericMethod; using 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; }
}
}
You are done.
Make sure to reference System.Linq.Dynamic inside the DLL.
来源:https://stackoverflow.com/questions/31821151/c-sharp-sort-array-of-objects-by-property-name-exists-in-the-object