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.
newArrEmpInfo.Where(e => e.Id == 5)because 1. You no longer know ifnewArrEmpInfois an IEnumerable, and 2. You do not know that there is anIdproperty on any of the objects in the collection - or that it's even anint). Could you provide more information as to what you're trying to accomplish? (Your goal; not implementation)objType newArrEmpInfomakes zero sense, as does the cast, because the object referenced bydataSourcealready is whatever type it is. Indeed, the callConvert.ChangeType()does nothing because thedataSourceis already the run-time type you're asking the method to change it to. Whatever it is you're actually trying to do, you need to explain better so we can actually understand your question. The question you asked here doesn't make any sense at all.