-
Notifications
You must be signed in to change notification settings - Fork 2
Tpc
- Instalar Visual Studio 2019 em INGLÊS
- Configurar o ambiente .Net Framework de linha de comando.
- Testar a compilação de programas C# na linha de comando (i.e.
csc
)
- Use o comando:
ilasm App.il
para gerar um móduloApp.exe
a partir do código fonte IL definido no ficheiroApp.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 classApp
definida em C# equivalente à definição IL deApp.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
- Terminar a implementação do método
CheckMethodsOf
validando a correcta execução deApp.cs
; - Unificar os métodos
LogParameterlessMethods
eLogFields
num único método com reutilização da mesmacache
.
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 desrc
. -
static IEnumerable Limit(IEnumerable src, int size)
- retorna uma nova sequência que contém apenas os primeiros elementos até ao limite desize
desrc
.
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
.