Skip to content
Miguel Gamboa edited this page May 11, 2020 · 14 revisions
  1. Instalar Visual Studio 2019 em INGLÊS
  1. Configurar o ambiente .Net Framework de linha de comando.
  2. Testar a compilação de programas C# na linha de comando (i.e. csc)
  • Use o comando: ilasm App.il para gerar um módulo App.exe a partir do código fonte IL definido no ficheiro App.il da pasta aula03-TPC-IL.
  • Verifique a execução de App.exe que deve produzir o seguinte output:
12, 6, 3, 10, 5, 16, 8, 4, 2, 1,
19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,
  • Implemente no ficheiro Program.cs a class App definida em C# equivalente à definição IL de App.il.
  • Referência a algumas instruções IL usadas em App.il:

Repetir os passos do TPC 02 para o programa il do ficheiro App03.il da pasta aula04-Exercicios-IL

Completar o método PrintParameters(MethodInfo m) do programa App01-inspect por forma a que apresente o tipo dos parametros de cada método. Por exemplo, para o tipo OAuth1Authenticator deverá apresentar:

OAuth1Authenticator
     get_Realm
     set_Realm(String )
     get_ParameterHandling
     set_ParameterHandling(OAuthParameterHandling )
     get_SignatureMethod
     set_SignatureMethod(OAuthSignatureMethod )
     get_SignatureTreatment
     set_SignatureTreatment(OAuthSignatureTreatment )
     ForRequestToken(String String )
     ForRequestToken(String String String )
     ForAccessToken(String String String String )
     ForAccessToken(String String String String String )
     ForAccessTokenRefresh(String String String String String )
     ForAccessTokenRefresh(String String String String String String )
     ForClientAuthentication(String String String String )
     ForProtectedResource(String String String String )
     Authenticate(IRestClient IRestRequest )
     Equals(Object )
     GetHashCode
     GetType
     ToString
  1. Terminar a implementação do método CheckMethodsOf validando a correcta execução de App.cs;
  2. Unificar os métodos LogParameterlessMethods e LogFields num único método com reutilização da mesma cache.

Alterar a implementação de Logger para que apenas os membros anotados com ToLog sejam incluidos na informação de logging

Adicionar a Student uma propriedade Birth do tipo Date ou DateTime. Observar que o Logger apresentará a data completa para essa propriedade. Criar uma nova anotação para aplicar à propriedade Birth para apresentar apenas o ano de nascimento. NOTA: Esta funcionalidade só requer alterações em App.cs e NENHUMA alteração a Logger.

Os exemplos apresentados baseiam-se na utilização das classes Student e School definidas por:

class Student {
  public int Nr { get; }
  public string Name { get; }
  public School School { get; }
  public string Nationality { get; }
}
class School {
  public string Name { get; }
  public string Location { get; }
  public override bool Equals(object obj) { /* iguais se Name e Location iguais */ }
  public override string ToString() { return Name + " (" + Location + ")"; }
}

Dada a definição da interface IEquality (interface IEquality {bool AreEqual(object x, object y);}), implemente a classe Equality que implementa a interface IEquality e considera dois objectos iguais quando as propriedades com o nome passado ao construtor forem iguais entre os objectos, conforme apresentado no exemplo seguinte: (Recorra a API de System.Reflection)

...
IEquality eq1 = new Equality(typeof(Student), "Nr", "Name", "School");
bool res1 = eq1.AreEqual(s1, s2); // res1 = true se s1 e s2 tiverem o mesmo Nr, Name e School
IEquality eq2 = new Equality(typeof(Student), "Nr", "Nationality");
bool res2 = eq2.AreEqual(s1, s2); // res2 = true se s1 e s2 tiverem o mesmo Nr e Nationality

Na continuação do exercício da aula 9 implemente uma nova classe Comparator que usa como critério de comparação os valores dos campos que verifiquem uma das condições:

  • Ser do tipo IComparable.
  • Estar anotados com o custom attribute ComparisonAttribute.

O atributo ComparisonAttribute recebe o critério de comparação por parâmetro correspondente ao tipo de uma classe que implementa a interface IComparer. Exemplo:

class Student {
  int nr;             // int é IComparable
  string name;        // string é IComparable
  [Comparison(typeof(AdressByStreet))] Address a; // Address NÃO é IComparable
  [Comparison(typeof(AccountByBalance))] Account acc; // Account NÃO é IComparable
  ...
}

Neste caso, a classe AdressByStreet define um critério de comparação com o comportamento:

((Address) x).street.CompareTo(((Address) y).street)

Considere o exemplo dos seguintes resultados de comparação de instâncias de Student:

Student s1 = new Student(14000, "Ana", new Adress("Rua Amarela", 24), new Account(9900));
Student s2 = new Student(14000, "Ana", new Adress("Rua Rosa", 24), new Account(9900));
Student s3 = new Student(14000, "Ana", new Adress("Rua Rosa", 24), new Account(100));
Student s4 = new Student(14000, "Ana", new Adress("Rua Rosa", 97), new Account(100));
IComparer cmp = new Comparer(typeof(Student)); 
int res1 = cmp.Compare(s1, s2); // res < 0 porque Rua Amarela é menor que Rua Rosa
int res2 = cmp.Compare(s2, s3); // res > 0 porque 9900 é maior que 100
int res3 = cmp.Compare(s3, s4); // res = 0 porque os critérios de comparação de todas as propriedades dão 0 

Concluir a implememtação do LoggerDynamic da aula 15 seguindo a abordagem de meta-programação proposta. Slides da aula 15

Implemente as seguintes operações intermédias utilitárias:

  • static IEnumerable Distinct(IEnumerable src) - retorna uma nova sequência sem elementos repetidos de src.

  • static IEnumerable Limit(IEnumerable src, int size) - retorna uma nova sequência que contém apenas os primeiros elementos até ao limite de size de src.

Estas operações intermédias ao contrário do Filter e Convert não recebem comportamento por parâmetro.

Teste estas operações em pipelines sobre uma sequência de objectos Student.

Implementar a operação intermédia Concat(IEnumerable src, IEnumerable other) que retorna uma nova sequência lazy com os elementos de src seguidos dos elementos de other.