キャストするのではなく、ToEntity メソッドを使用する必要があります。typeof(T).Name には大文字と小文字の違いがある場合があるため、ヘルパー関数も書きました。
/// <summary>
/// Retrieves the Entity of the given type with the given Id, with the given columns
/// </summary>
/// <typeparam name="T">An early bound Entity Type</typeparam>
/// <param name="service">open IOrganizationService</param>
/// <param name="id">Primary Key of Entity</param>
/// <param name="columnSet">Columns to retrieve</param>
/// <returns></returns>
public static T GetEntity<T>(this IOrganizationService service, Guid id, ColumnSet columnSet)
where T : Entity
{
return service.Retrieve(EntityHelper.GetEntityLogicalName<T>(), id, columnSet).ToEntity<T>()
}
public static string GetEntityLogicalName<T>() where T : Entity
{
return GetEntityLogicalName(typeof(T));
}
public static string GetEntityLogicalName(Type type)
{
var field = type.GetField("EntityLogicalName");
if (field == null)
{
if (type == typeof(Entity))
{
return "entity";
}
else
{
throw new Exception("Type " + type.FullName + " does not contain an EntityLogicalName Field");
}
}
return (string)field.GetValue(null);
}